2017-02-20 35 views
-1

Я хочу установить значения по умолчанию для всех полей decimal в Object. Метод, который делает это выглядит следующим образом:Преобразование типа в myType

private Type SetAllFieldsAsDefault(Type register) 
{ 
    var fields = register.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); 
    foreach (var field in fields) 
    { 
     if (field.FieldType != typeof(double)) continue; 
     field.SetValue(field, 0); 
    } 
    return register; 
} 

После Стараюсь кастинг на myType, но он не работает

myType = (MyType)SetAllFieldsAsDefault(myType.GetType()); 

Как я могу это сделать?

+0

Вы не давая ему реальный объект, чтобы установить значение в и вы только возвращаете 'type'. Он не может быть включен в фактический объект, который у вас есть. 'SetValue' должен иметь фактический объект в качестве первого аргумента. –

+0

Я не знаю, что этот код ожидает делать. Вы не можете устанавливать значения экземпляров для типа. И 'field.SetValue (field, 0)' просто неверно. См. [Документация] (https://msdn.microsoft.com/en-us/library/6z33zd7h (v = vs.110) .aspx) – Amy

ответ

1

Вам нужен объект в качестве входных данных и в качестве выходного сигнала

private object SetAllFieldsAsDefault(object _register) 
{ 
     Type register = _register.GetType(); 

и вы будете устанавливать свои значения в указанном выше способе

 field.SetValue(_register, 0); 

Наконец цепной измененный входной

return _register; 
} 

вызов метода

myType = (MyType)SetAllFieldsAsDefault(myType); 

Вот test online

public static void Main() 
{ 
    var myType = new MyType(); 
    Console.WriteLine(myType.one + " " + myType.two); 
    Console.WriteLine("before"); 
    myType = SetAllFieldsAsDefault(myType) as MyType; 
    Console.WriteLine("after"); 
    Console.WriteLine(myType.one + " " + myType.two); 
} 

class MyType { 
    internal double one = -1.1; 
    internal string test = "hi"; 
    internal double two = 3.3; 
} 

выход

before 
-1.1 3.3 
after 
0 0