Как узнать тип свойства, если это коллекция в отражении?

#c# #reflection

#c# #отражение

Вопрос:

 List<MyClass> MyClassPro
{
   get;set;
}

MyClass obj = new MyClass();

obj.MyClassPro = null;
  

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

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

       Type t = obj.GetType();
  

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

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

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

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

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

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

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

Комментарии:

1. Не могли бы вы уточнить, не похоже, что это будет компилироваться.

2. Это неполный код. Просто предположите ситуацию и, пожалуйста, дайте мне ответ.

Ответ №1:

Используйте 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 .

Комментарии:

1. Да, его возвращающая система. Коллекции. Generic.List. Мне нужен тип свойства, а не коллекция.

2. Вы должны иметь возможность вызывать GetGenericArguments().First() on propertyInfo.PropertyType , как в вашем собственном примере кода.

3. Да, я звонил. Оно вернуло System. Коллекции. Generic.List.

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

Ответ №2:

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

 if (propertyInfo.PropertyType.IsGenericType)
{
    // code ...
}
  

Комментарии:

1. Я использовал то, что вы предложили. Но я хочу получить тип, если свойство коллекции равно null.

2. я полагаю, вы сначала создаете contractor для класса. contractor () { Список<MyClassPro> dd = новый список<MyClassPro>(); dd = null; }