Почему Type.GetElementType возвращает ноль? - PullRequest
5 голосов
/ 16 августа 2011

У меня есть метод, который принимает в качестве входного параметра объект типа IEnumerable. Я хочу перечислить перечисление и для каждого элемента использовать отражение, чтобы получить значение для каждого свойства.

У меня есть следующий код:

protected void WriteData(IEnumerable data)
{
    var enumerationTypeInfo = data.GetType();
    var itemTypeInfo = enumerationTypeInfo.GetElementType();

    ...
}

Проблема в том, что enumerationTypeInfo.GetElementType() всегда возвращает null. В частности, я передаю List<Entry> в WriteData, где Entry - это класс, который я создал. Когда я использую отладчик и устанавливаю точку останова, я вижу, что enumerationTypeInfo правильно показывает, что это список типа Entry, но почему GetElementType возвращает null?

Спасибо

Ответы [ 2 ]

12 голосов
/ 16 августа 2011

GetElementType() возвращает тип элемента массива.List<T> не является типом массива и, следовательно, не имеет «тип элемента».

Если вы хотите получить тип элементов, которые генерирует случайный IEnumerable<T>, попробуйте что-то вроде этого:

public static Type GetEnumerableType(Type type)
{
    if (type == null)
        throw new ArgumentNullException("type");

    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>))
        return type.GetGenericArguments()[0];

    var iface = (from i in type.GetInterfaces()
                 where i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEnumerable<>)
                 select i).FirstOrDefault();

    if (iface == null)
        throw new ArgumentException("Does not represent an enumerable type.", "type");

    return GetEnumerableType(iface);
}

Обратите внимание, что типы могут реализовывать более одной версии одного и того же универсального интерфейса;например, тип может реализовывать как IEnumerable<int>, так и IEnumerable<string>.Как вы справитесь с этим делом, зависит от вас.Метод, который я предоставлю, возьмет тот тип интерфейса, который ему передан во время выполнения.


См. пример использования вышеуказанного метода для ideone.

8 голосов
/ 16 августа 2011

GetElementType предназначен для использования с массивами, а не с другими общими классами.Чтобы получить универсальные параметры универсального типа, вы можете использовать Type.GetGenericArguments.

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