К настоящему времени на вопрос уже получен ответ, но я хотел бы представить вам урезанную - и я думаю, довольно тривиальную версию - "вызова общего метода расширения", который можно использовать дляinvoke Count
рефлексивно:
// get Enumerable (which holds the extension methods)
Type enumerableT = typeof(Enumerable);
// get the Count-method (there are only two, you can check the parameter-count as in above
// to be certain. Here we know it's the first, so I use the first:
MemberInfo member = enumerableT.GetMember("Count")[0];
// create the generic method (instead of int, replace with typeof(yourtype) in your code)
MethodInfo method = ((MethodInfo) member).MakeGenericMethod(typeof(int));
// invoke now becomes trivial
int count = (int)method.Invoke(null, new object[] { yourcollection });
Вышеприведенное работает, потому что вам не нужно использовать универсальный тип IEnumerable<>
для возможности вызова Count
, который является расширениемEnumerable
и принимает аргумент IEnumerable<T>
в качестве первого параметра (это расширение), но вам не нужно указывать это.
Обратите внимание, что из прочтения вашего вопроса, кажется,Я бы сказал, что вы должны использовать обобщенные типы для ваших типов, что добавляет безопасность типов обратно в ваш проект и все еще позволяет вам использовать Count или что-то еще.В конце концов, единственное, что несомненно, это то, что все Enumerable
, верно?Если это так, кому нужно отражение?