我正在调用一个返回一个对象的函数,在某些情况下,这个对象将是一个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,那么这可以正常工作。
答案 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);
}