2010-08-05 2 views
5

Я вызываю функцию, которая возвращает объект, и в определенных обстоятельствах этот объект будет 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]».

UPDATE

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

using System.Collections.Generic; 

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

ответ

7

В ролях его ICollection и использовать его .Count

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

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

Не я все еще нужен тип хотя? –

+0

может быть, я делаю что-то неправильно, но это дает мне: Ошибка \t \t 1 Использование универсального типа «System.Collections.Generic.ICollection » требует «1» аргументы типа –

+0

@ Крис, список непосредственно реализует ICollection (не родовое), который имеет свойство '.Count'. Не требуется тип. Добавлен образец кода для ясности. – Marc

0

Использование GetProperty вместо GetMethod

+0

это возвращает нуль –

3

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

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

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

+0

Мне это нравится, но это работает только тогда, когда список фактически является _is_ типом ICollection. Я не думаю, что это всегда имеет место в вопросе ОП. – Marc

+0

По общему признанию, это немного сложно сказать, но поскольку приведенные примеры являются как «List », это работает для данных случаев. Однако, глядя на принятый ответ, кажется, что в этом случае нет смысла использовать отражение. Если отражение не требуется, гораздо проще просто применить соответствующий тип. –

+0

не работал для меня: «Использование общего типа« ICollection »требует 1 аргумент типа» –

0

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

var countMethod = typeof(Enumerable).GetMethods().Single(method => method.Name == "Count" && method.IsStatic && method.GetParameters().Length == 1); 
Смежные вопросы