C# - получить тип элемента для типов коллекций

Предметы коллекции CookieCollection - это Cookie. Предметы другой коллекции могут быть SomeType и т. д.

Как я могу узнать это с помощью отражения? Мне нужно получить тип элемента для типов коллекции.

Например, что-то CookieCollection.ItemsType() должно возвращать Cookie

возможный?

У вас возникли проблемы при использовании метода GetType ()?

Rakesh Burbure 10.07.2018 14:18

Почему вы захотели получить CookieCollection рефлексией?

D-Shih 10.07.2018 14:18

Я пишу De-Serializer, мне тоже нужно знать каждый тип элемента коллекции.

Inside Man 10.07.2018 14:19

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

Furkan Kambay 10.07.2018 14:20

Кстати, как вы задаете вопрос, похоже, что вас особенно интересует только CookieCollection. Вы должны быть более ясными.

Furkan Kambay 10.07.2018 14:22

@FurkanKambay как получить тип индексатора?

Inside Man 10.07.2018 14:22

@Nofuzy В чем заключается ваша основная проблема? Почему вам нужно знать?

mjwills 10.07.2018 14:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
557
3

Ответы 3

Для этой цели вы можете использовать метод Type.GetGenericArguments.

List<Foo> myList = ...

Type myListElementType = myList.GetType().GetGenericArguments().Single();
CookieCollection не является универсальной коллекцией.
Magnus 10.07.2018 14:23

вы можете использовать CookieCollection как класс типа объекта

Manish Vyas 10.07.2018 14:26

Чтобы узнать это, взглянув на индексатор:

public static Type GetCollectionItemType(Type collectionType)
{
    var intIndexer = collectionType.GetMethod("get_Item", new[] { typeof(int) });
    //var stringIndexer = collectionType.GetMethod("get_Item", new[] { typeof(string) });
    return intIndexer?.ReturnType ?? null; // null mean the type has no int indexer
}

Вот:

    public static Type GetIndexerType(this Type collectionType)
    {
        if (typeof(ICollection).IsAssignableFrom(collectionType))
        {
            var indexerProperty = collectionType.GetProperties().FirstOrDefault(x => x.Name == "Item");
            if (indexerProperty != null)
            {
                return indexerProperty.PropertyType;
            }
        }

        return null;
    }

Однако не все коллекции имеют свойство Item.

Magnus 10.07.2018 14:42

@Magnus Очевидно, это имя индексатора. Если у типа есть индексатор, у вас не может быть свойства с именем Item или метода с именем get_Item с такими же параметрами. (видимо, я только что научился этому, попробовав)

Furkan Kambay 10.07.2018 14:49

@FurkanKambay Но ICollection действительно имеет такое свойство, поэтому нет гарантии, что оно будет в вашей коллекции.

Magnus 10.07.2018 14:59

Другие вопросы по теме