Как узнать тип свойства, если это коллекция в отражении? - PullRequest
6 голосов
/ 17 мая 2011
List<MyClass> MyClassPro
{
   get;set;
}

MyClass obj = new MyClass();

obj.MyClassPro = null;

Считайте, что MyClassPro имеет значение null.В ситуации Отражения я не буду знать Имя класса или Имя свойства.

Если я пытаюсь получить тип свойства, используя GetType, например,

      Type t = obj.GetType();

Он возвращает "System.Collections.Generic.list. Но я ожидаю получить тип как MyClass.

Я также попробовал способ, подобный

        foreach(PropertyInfo propertyInfo in obj.GetProperties())
        {
             if(propertyInfo.IsGenericType)
             {
              Type t = propertyInfo.GetValue(obj,null).GetType().GetGenericArguments().First();
             }
        }

Но он возвращает ошибку, так как значение свойства коллекции равноnull, поэтому мы не можем получить тип.

В этой ситуации как я могу получить свойство типа коллекции.

Пожалуйста, помогите мне!

Заранее спасибо.

Ответы [ 2 ]

11 голосов
/ 17 мая 2011

Используйте propertyInfo.PropertyType вместо propertyInfo.GetValue(obj,null).GetType(), что должно дать вам тип свойства, даже если значение свойства null.

Так что, когда у вас есть класс, как

public class Foo {
    public List<string> MyProperty { get; set; }
}

и экземпляр Foo в obj, затем

var propertyInfo = obj.GetType().GetProperty("MyProperty"); // or find it in a loop like in your own example
var typeArg = propertyInfo.PropertyType.GetGenericArguments()[0];

даст вам значение System.String (как экземпляр System.Type) в typeArg.

6 голосов
/ 17 мая 2011

Используйте propertyInfo.PropertyType, свойство которого имеет имя IsGenericType, например:

if (propertyInfo.PropertyType.IsGenericType)
{
    // code ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...