如何从IEnumerable <t> </t>中提取Type对象

时间:2013-10-02 16:07:14

标签: c# reflection ienumerable system.reflection

我有以下功能

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类型。 我怎么能做到这一点?

4 个答案:

答案 0 :(得分:2)

在问题中:typeof(T)将起作用。

通常可以在e上使用反射来提取类型参数 - T - IEnumerable<T>来自Type.GetGenericArguments

答案 1 :(得分:1)

为什么不这样做? :

Type t = typeof(T);

详细了解typeof

编辑:

对于更复杂的情况,您可以拥有多种类型,因此您可以这样做:

IEnumerable<Type> GetTypes (IEnumerable<object> list)
{
    foreach (object a in list)
    {
       yield return a.GetType();
    }
}

如果它只是一种类型,你可以写Type t = GetTypes(yourEnumerable).FirstOrDefault()GetType()将获得真实类型的对象。

阅读GetType

答案 2 :(得分:1)

// 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]);
}

答案 3 :(得分:0)

要获得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();
    }
}