获取未知类型列表的计数

时间:2010-08-05 18:44:43

标签: c# generics reflection

我正在调用一个返回一个对象的函数,在某些情况下,这个对象将是一个List。

此对象上的GetType可能会给我:

{System.Collections.Generic.List`1[Class1]}

{System.Collections.Generic.List`1[Class2]}

我不在乎这种类型是什么,我想要的只是一个伯爵。

我试过了:

Object[] methodArgs=null;
var method = typeof(Enumerable).GetMethod("Count");
int count = (int)method.Invoke(list, methodArgs);

但是这给了我一个AmbiguousMatchException,在不知道类型的情况下我似乎无法解决这个问题。

我已经尝试过施法给IList,但我得到了:

无法将类型为'System.Collections.Generic.List'1 [ClassN]'的对象强制转换为'System.Collections.Generic.IList'1 [System.Object]'。

更新

下面的Marcs答案实际上是正确的。它不适合我的原因是我有:

using System.Collections.Generic;

位于我的文件顶部。这意味着我一直在使用IList和ICollection的通用版本。如果我指定System.Collections.IList,那么这可以正常工作。

5 个答案:

答案 0 :(得分:8)

将其投射到ICollection并使用.Count

List<int> list = new List<int>(Enumerable.Range(0, 100));

ICollection collection = list as ICollection;
if(collection != null)
{
  Console.WriteLine(collection.Count);
}

答案 1 :(得分:3)

你可以这样做

var property = typeof(ICollection).GetProperty("Count");
int count = (int)property.GetValue(list, null);

假设你想通过反射来做到这一点。

答案 2 :(得分:0)

使用GetProperty而不是GetMethod

答案 3 :(得分:0)

你可以这样做

var countMethod = typeof(Enumerable).GetMethods().Single(method => method.Name == "Count" && method.IsStatic && method.GetParameters().Length == 1);

答案 4 :(得分:0)

这可以帮助...

        if (responseObject.GetType().IsGenericType)
        {
            Console.WriteLine(((dynamic) responseObject).Count);
        }