3 回答
TA贡献1856条经验 获得超5个赞
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;
}
}
TA贡献1864条经验 获得超2个赞
给定一个对象,我怀疑是某种的IList<>,我怎么能确定的东西它是一个IList<>?
这是勇敢的解决方案。它假定您具有要测试的实际对象(而不是Type)。
public static Type ListOfWhat(Object list)
{
return ListOfWhat2((dynamic)list);
}
private static Type ListOfWhat2<T>(IList<T> list)
{
return typeof(T);
}
用法示例:
object value = new ObservableCollection<DateTime>();
ListOfWhat(value).Dump();
版画
typeof(DateTime)
TA贡献1963条经验 获得超6个赞
Marc的答案是我为此使用的方法,但是为了简单起见(以及更友好的API?),您可以在集合基类中定义一个属性,如果您具有以下属性:
public abstract class CollectionBase<T> : IList<T>
{
...
public Type ElementType
{
get
{
return typeof(T);
}
}
}
我发现这种方法很有用,并且对于任何泛型新手来说都很容易理解。
- 3 回答
- 0 关注
- 3667 浏览
添加回答
举报