#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()
onpropertyInfo.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; }