如何从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 类型。我怎样才能做到这一点?

如何从IEnumerable<T>中提取类型对象

在问题中的情况下: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();
    }
}