2011-11-10 3 views
0

Я новичок отражение в C# и что-то подобное, как это:Типа литейного PropertyType

class A 
{ 
    DateTime _time = DateTime.Now; 
    public DateTime Time 
    { 
     set 
     { 
      _time = value; 
     } 
     get 
     { 
      return _time; 
     } 
    } 
} 

И этот метод где-то в приложении:

public Type GetSomeType(int num) 
{ 
    switch (num) 
    { 
     case 0: 
      DateTime time = DateTime.Now; 
      return time.GetType(); 
     case 1: 
      int i = 5; 
      return i.GetType(); 
     default: 
      return null; 
    } 
} 

То, что я пытаюсь сделать устанавливается в Time свойство класса А с результатом метода GetSomeType:

A MyClass = new A(); 
MyClass.Time = (DateTime)GetSomeType(0); //Clearly, this does not work 

Я не знаю, возможно ли это вообще или я совершенно не прав здесь? В моем реальном приложении это сложнее, так как я работаю с PropertyInfo, но пока я был бы рад понять концепцию.

Благодаря

Юрген

+0

Почему вы это делаете? Должна быть действительно веская причина использовать отражение. –

+2

И вы пытаетесь присвоить тип свойству DateTime, это не имеет смысла. Какую проблему вы пытаетесь решить здесь? –

+0

Вы сейчас просто получаете тип, я думаю, вы хотите получить значение свойства? – Kolja

ответ

3

Естественно, это не будет работать, потому что вы путаете типы со значением (или экземплярами) типов.

Возможно, вам нужно будет изучить PropertyInfo.GetValue (PropertyInfo.SetValue), но в зависимости от того, что вы хотите сделать дальше, - но я думаю, вам, возможно, потребуется рассмотреть именно то, что вы хотите сделать ; в вашем примере, например, вы можете просто вернуть объект или, возможно, динамический, поскольку вы создаете экземпляр и обрабатываете значение напрямую. Но похоже, что вы хотите получить значение существующего экземпляра чего-то.

Скажем, если у вас есть A и B, вы хотите получить значение B.a и установить A.a с ним, это не ясно из вашего объяснения, почему вы не можете просто сделать B.a = A.a, или то, что дискриминатор num правильно для; но если вы сделать должны использовать отражение и уже есть PropertyInfo, то:

public dynamic GetSomeValue(object instance, PropertyInfo property) 
{ 
    return property.GetValue(instance, null); 
} 

Хотя, это не где-нибудь недалеко от идеала, и в основном недостатки, если не избыточна - это надеюсь, будет достаточно информации чтобы вы могли выйти замуж за то, что вы можете сделать с тем, что вам нужно сделать.

+0

SetValue Я думаю, вы имеете в виду :) – leppie

+1

@leppie Я рассмотрел представление обоих, но OP имеет строго типизированный 'A' и хочет _get_ значение свойства' B'. –

+0

@Mr Я пока не знаю динамического ключевого слова. Все, что я хочу сделать, это метод GetSomeType (извините, его следует называть GetSomeValue), возвращающего значение некоторого типа, так что я могу установить значение свойства с помощью: propInfo [0] .SetValue (MyClass, GetSomeType (...), null) – Juergen

1

Вам не нужно отражать, чтобы задать тип свойства Время. он определяется как тип DateTime. Я не уверен, что это проблема для размышлений.

Также в методе GetSomeType вам не нужно создавать объекты для получения их типа.

public Type GetType(int num) 
{ 
    switch(num) 
    { 
    case 0: 
     return typeof(DateTime); 
    case 1: 
     return typeof(int) 
    } 

    return null; 
} 
1

Существует, вероятно, некоторое непонимание того, что представляет Type. Он представляет только объект типа, ничего другого. Ваш код может быть упрощен к следующему, и он будет вести себя точно так же:

public Type GetSomeType(int num) 
{ 
    switch (num) 
    { 
     case 0: 
      return typeof(DateTime); 
     case 1: 
      return typeof(int); 
     default: 
      return null; 
    } 
} 

Я предполагаю, что вы хотите вернуть object, или что-то вроде этого:

public object GetSomeType(int num) 
{ 
    switch (num) 
    { 
     case 0: 
      return DateTime.Now; 
     case 1: 
      return 5; 
     default: 
      return null; 
    } 
} 

Это должно работать для вас , Но я понятия не имею, зачем вам это делать.

1

Во-первых, вместо этого:

DateTime time = DateTime.Now; 
return time.GetType(); 

вы можете сделать это:

return typeof(DateTime); 

также, что вам не нужно, чтобы бросить, если (только гадать) вы устанавливаете свойство через PropertyInfo:

propInfo.SetValue(instance, value, null); 

, где значение переменной может быть объектом типа, только тип наработка, чтобы соответствовать, который вы также можете проверить, как т его:

if (value == null || propInfo.PropertyType == value.GetType()) 

Тем не менее, мне интересно, что вы пытаетесь сделать.

0

Вам нужно будет изменить свою реализацию, чтобы использовать тип возвращаемого объекта вместо типа в качестве типа возвращаемого значения, а также использовать тип с нулевым дат-временем. Ниже приведен пример кода:

class A 
{ 
    DateTime? _time = DateTime.Now; 
    public DateTime? Time 
    { 
     set 
     { 
      _time = value; 
     } 
     get 
     { 
      return _time; 
     } 
    } 
} 


public object GetSomeType(int num) 
{ 
    switch (num) 
    { 
     case 0: 
      DateTime time = DateTime.Now; 
      return time; 
     case 1: 
      int i = 5; 
      return i; 
     default: 
      return null; 
    } 
} 

A MyClass = new A(); 
MyClass.Time = this.GetSomeType(0) as DateTime?; //This should now work 
Смежные вопросы