Тип перечисления отличается от целого числа. В вашем примере var
не оценивает int, оно оценивает тип перечисления. Вы бы получили тот же результат, если бы использовали сам тип перечисления.
Типы перечисления выводят имя при печати, а не их значение.
Вам необходимо указать конкретный объект, для которого вы хотите вызвать рассматриваемое свойство:
prop.GetValue(item, null);
PropertyInfo - это просто метаданные о свойстве типа , а не на конкретном экземпляре объекта. PropertyInfo не знает, из какого экземпляра он пришел (если есть) - только тип / класс, из которого он произошел.
Вы можете почти думать о PropertyInfo как о просто имени свойства. Этой информации недостаточно, чтобы что-то сделать с этим одним - тогда мы должны сказать «получить значение свойства с таким именем на ... что? » о предоставляемом нами объекте.
PropertyInfo
представляет сам механизм свойств (тип, метод получения, метод набора и т. Д.), А не свойство, привязанное к конкретному экземпляру. Если свойство нестатическое, вы должны предоставить экземпляр для чтения этого свойства - это первый параметр GetValue. Другими словами, если pi
- это PropertyInfo
, представляющий свойство Test
в некотором классе, а someObject
- экземпляр этого класса:
object a = someObject.Test;
object b = pi.GetValue(someObject, null);
обе строки получают значение одного и того же свойства одного и того же объекта. Если свойство является статическим, вам, очевидно, не нужно передавать экземпляр (вместо этого передайте null). Второй параметр - это индекс для индексированных свойств - C # не поддерживает индексированные свойства (он поддерживает индексаторы, которые не совсем то же самое),