0

我有以下功能

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

4 回答 4

2

在问题的情况下:typeof(T)会起作用。

更一般地,反射可用于e提取IEnumerable<T>via的类型参数-<code>T- Type.GetGenericArguments

于 2013-10-02T16:10:55.853 回答
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]);
}
于 2013-10-02T16:09:26.250 回答
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

于 2013-10-02T16:09:06.797 回答
0

要获得TypeT 使用这个:

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();
    }
}
于 2013-10-02T16:16:25.230 回答