如何从IEnumerable中提取类型对象
本文关键字:提取 取类型 对象 IEnumerable | 更新日期: 2023-09-27 18:33:33
我有一个以下函数
void Func<T>(IEnumerable<T> e)
{
// Need type of T here
Type t = e.CollectionElementsType() ???
}
现在为了使它更复杂,我有以下代码
void Func(IEnumerable<object> e)
{
// Need type of T here
Type t = e.CollectionElementsType() ???
}
现在假设我对第二个实现有以下调用
Func(new List<int>().Cast<object>());
我希望 Func 检测 int 类型。我怎样才能做到这一点?
在问题中的情况下:typeof(T)
将起作用。
更一般地说,反射可以在e
上通过Type.GetGenericArguments
提取IEnumerable<T>
的类型参数 T
。
// returns an enumeration of T where o : IEnumerable<T>
public IEnumerable<Type> GetGenericIEnumerables(object o) {
return o.GetType()
.GetInterfaces()
.Where(t => t.IsGenericType == true
&& t.GetGenericTypeDefinition() == typeof(IEnumerable<>))
.Select(t => t.GetGenericArguments()[0]);
}
为什么不这样做?
:Type t = typeof(T);
阅读更多 关于 类型类型
编辑:
对于更复杂的情况,您可以有多个类型,因此您可以执行以下操作:
IEnumerable<Type> GetTypes (IEnumerable<object> list)
{
foreach (object a in list)
{
yield return a.GetType();
}
}
如果真的只有一种类型,你可以写Type t = GetTypes(yourEnumerable).FirstOrDefault()
. GetType()
将获得对象的真实类型。
阅读有关 GetType 的信息
要获取 T 的Type
,请使用以下命令:
void Func(IEnumerable<T> e)
{
Type t = typeof(T);
}
要获取元素的Type
,另一种方法是获取第一项的类型(假设列表中的所有项都属于同一类型):
void Func(IEnumerable<T> e)
{
Type t;
if(e.Count() > 0){
t = e.ElementAt(0).GetType();
}
}