2015-02-04 1 views
1

Давайте предположим, что мы имеем эти три типа:Как отразить класс от его стоимости?

class class1{ public static int serial=1}; 
class class2{ public static int serial=2}; 
class class3{ public static int serial=3}; 

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

class class1{ public override byte serial {get{return 0x01; }}}; 

В моем приложении я получаю серийный значение где-то и нужно отражают соответствующий класс. Возможно ли отразить любой из этих типов с использованием серийного поля этого элемента? Должен ли я создавать таблицу карт между серийным идентификатором и именем класса, чтобы найти связанное имя класса для отражения? Или System.Reflection позволяет мне найти класс непосредственно из его поля или значения свойства? Я думаю, это было бы лучше, потому что нам не нужно редактировать таблицу для новых типов.
Спасибо за любую помощь.

+4

Эти поля статические? –

+0

Да, они могут быть. –

ответ

6

Да, вы можете получить тип по значению поля:

var type = Assembly.GetExecutingAssembly() 
      .GetTypes() 
      .FirstOrDefault(x => x.GetField("serial") != null && 
           (int)x.GetField("serial").GetValue(null) == 2) 

Если типы определены в другой сборке, а не в настоящее время выполнения сборки, то вам нужно сначала получить эту сборку с использованием методов в Assembly класс (подобный Load, LoadFrom, LoadFile).

А также поля должны быть в порядке, чтобы это работало static, в противном случае вам нужен экземпляр, чтобы получить значение поля и передать его GetValue методы вместо нуля.

+2

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

+0

Спасибо за ваш ответ. Так что, если бы у меня было такое поле: public override byte serial {get {return 0x2C; }} Могу ли я использовать это в своем решении? эти классы производятся из абстрактного класса с абстрактным свойством serial. Я переопределяю это поле для каждого производного класса. –

+0

Это не поле, а свойство. и да, вы можете просто сменить GetField на GetProperty.but, так как это член экземпляра, вам нужен экземпляр, чтобы получить его значение. –