Попытка использовать отражение, чтобы найти первое свойство Int32 класса - PullRequest
0 голосов
/ 27 сентября 2010

Я пытаюсь найти первое свойство класса , которое является Integer .. и получить его значение.

Итак, я получил следующий кодкоторый всегда возвращает false:

foreach(var property in type.GetProperties(BindingFlags.Public |
    BindingFlags.Instance))
{
    var someType = property.PropertyType is int; // Always false.
}

Почему это / что я сделал не так.Это должно быть очень просто: (

/ у меня плохой день ...

1 Ответ

4 голосов
/ 27 сентября 2010

Изменить тест на:

var firstInt32Property = property.PropertyType == typeof(int);

Это необходимо, поскольку свойство свойства свойства само по себе не является целым числом: это System.Type объект, который (свободно) представляет, какой тип возвращает свойство-получатель / свойство-установщик. С другой стороны, , вызывая для свойства get для экземпляра содержащего типа, будет получено действительное целое число.

Вот способ использования LINQ вместо цикла foreach:

var firstInt32Property = type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
                             .First(p => p.PropertyType == typeof(int)); 

(Это вызовет исключение, если такого свойства не существует.)


Чтобы получить значение свойства из экземпляра содержащего типа:

int value = (int)firstInt32Property.GetValue(myObj, null);

Это, конечно, потерпит неудачу, если «первое» свойство Int32 окажется индексатором или действительно, если оно просто не имеет геттера. Вы можете отфильтровать такие свойства в исходном запросе, если такие сценарии вероятны.


Также обратите внимание, что этот код имеет ограниченное использование, потому что идея «первого свойства класса, являющегося целым числом» немного подозрительна. С Type.GetProperties:

Метод GetProperties не вернуть свойства в конкретном порядок, такой как алфавитный или порядок декларирования. Ваш код не должен зависит от порядка, в котором свойства возвращаются, потому что это порядок меняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...