C#通用列表 如何获得T的类型?[重复]

我正在做一个反思项目,现在被困了。

如果我有一个myclass可以容纳的对象,那么List<SomeClass>如果该属性myclass.SomList为空,有人知道如何按下面的代码获取类型吗?

List<myclass> myList = dataGenerator.getMyClasses();

lbxObjects.ItemsSource = myList;

lbxObjects.SelectionChanged += lbxObjects_SelectionChanged;

private void lbxObjects_SelectionChanged(object sender, SelectionChangedEventArgs e)

{

Reflect();

}

Private void Reflect()

{

foreach (PropertyInfo pi in lbxObjects.SelectedItem.GetType().GetProperties())

{

switch (pi.PropertyType.Name.ToLower())

{

case "list`1":

{

// This works if the List<T> contains one or more elements.

Type tTemp = GetGenericType(pi.GetValue(lbxObjects.SelectedItem, null));

// but how is it possible to get the Type if the value is null?

// I need to be able to create a new object of the type the generic list expect.

// Type type = pi.getType?? // how to get the Type of the class inside List<T>?

break;

}

}

}

}

private Type GetGenericType(object obj)

{

if (obj != null)

{

Type t = obj.GetType();

if (t.IsGenericType)

{

Type[] at = t.GetGenericArguments();

t = at.First<Type>();

}

return t;

}

else

{

return null;

}

}

回答:

Type type = pi.PropertyType;

if(type.IsGenericType && type.GetGenericTypeDefinition()

== typeof(List<>))

{

Type itemType = type.GetGenericArguments()[0]; // use this…

}


通常,要支持any IList<T>,您需要检查接口:

foreach (Type interfaceType in type.GetInterfaces())

{

if (interfaceType.IsGenericType &&

interfaceType.GetGenericTypeDefinition()

== typeof(IList<>))

{

Type itemType = type.GetGenericArguments()[0];

// do something...

break;

}

}

以上是 C#通用列表 如何获得T的类型?[重复] 的全部内容, 来源链接: utcz.com/qa/411040.html

回到顶部