Получить счетчик списка неизвестного типа - PullRequest
6 голосов
/ 05 августа 2010

Я вызываю функцию, которая возвращает объект, и в определенных обстоятельствах этот объект будет списком.

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] '.

UPDATE

Маркс ответ ниже на самом деле правильно. Причина, по которой это не сработало, заключается в том, что у меня есть:

using System.Collections.Generic;

вверху моего файла. Это означает, что я всегда использовал универсальные версии IList и ICollection. Если я укажу System.Collections.IList, тогда все будет хорошо.

Ответы [ 4 ]

8 голосов
/ 05 августа 2010

Приведите его к ICollection и используйте это .Count

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

ICollection collection = list as ICollection;
if(collection != null)
{
  Console.WriteLine(collection.Count);
}
3 голосов
/ 05 августа 2010

Вы могли бы сделать это

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

при условии, что вы хотите сделать это с помощью отражения.

0 голосов
/ 18 января 2011

Вы можете сделать это

var countMethod = typeof(Enumerable).GetMethods().Single(method => method.Name == "Count" && method.IsStatic && method.GetParameters().Length == 1);
0 голосов
/ 05 августа 2010

Используйте GetProperty вместо GetMethod

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...