Как вызвать System.Linq.Enumerable.Count <> в IEnumerable < T> используя Reflection?

У меня есть набор IEnumerable Collections, точное число и типы которых часто изменяются (из-за автоматической генерации кода).

Это выглядит примерно так:

public class MyCollections {
    public System.Collections.Generic.IEnumerable<SomeType> SomeTypeCollection;
    public System.Collections.Generic.IEnumerable<OtherType> OtherTypeCollection;
    ...

Во время выполнения я хочу определить каждый тип и его количество без необходимости переписывать код после каждого генерирования кода. Поэтому я ищу общий подход с использованием отражения. Результат, который я ищу, выглядит примерно так:

MyType: 23
OtherType: 42

Моя проблема в том, что я не могу понять, как правильно вызвать метод Count. Вот что у меня есть:

        // Handle to the Count method of System.Linq.Enumerable
        MethodInfo countMethodInfo = typeof(System.Linq.Enumerable).GetMethod("Count", new Type[] { typeof(IEnumerable<>) });

        PropertyInfo[] properties = typeof(MyCollections).GetProperties();
        foreach (PropertyInfo property in properties)
        {
            Type propertyType = property.PropertyType;
            if (propertyType.IsGenericType)
            {
                Type genericType = propertyType.GetGenericTypeDefinition();
                if (genericType == typeof(IEnumerable<>))
                {
                    // access the collection property
                    object collection = property.GetValue(someInstanceOfMyCollections, null);

                    // access the type of the generic collection
                    Type genericArgument = propertyType.GetGenericArguments()[0];

                    // make a generic method call for System.Linq.Enumerable.Count<> for the type of this collection
                    MethodInfo localCountMethodInfo = countMethodInfo.MakeGenericMethod(genericArgument);

                    // invoke Count method (this fails)
                    object count = localCountMethodInfo.Invoke(collection, null);

                    System.Diagnostics.Debug.WriteLine("{0}: {1}", genericArgument.Name, count);
                }
            }
        }
6
задан mbi 23 August 2010 в 10:07
поделиться