Отношения между экземплярами Списка <T>

Там какой-либо путь состоит в том, чтобы сказать через отражение, что универсальный список Типа A связан с универсальным списком Типа B? Например, у меня есть a List<string> и a List<int>. Как я могу сказать через отражение, что оба этих типа являются 'экземплярами' List<T>. Я думаю, что у меня есть проблема потому что List<T> не реальный тип. Вы не можете сделать typeof(List<T>) например. List<T> прием компилятора, который я предполагаю. Так должен там так или иначе определить, прибывают ли два различных типов из List<T>?

5
задан Eilon 19 January 2010 в 07:00
поделиться

4 ответа

Конечно, вы можете ... Список <> на самом деле то, что называется «несвязанным универсальным типом», что это не имеет был параметризован с типом. Когда аргумент типа указан, он называется «связанным генерическим типом». Тип, который включает в себя «необработанные» параметры типа, такие как , список - «открытый универсальный тип», и тот, который включает в себя только фактические типы, такие как список «Закрытый универсальный тип». Единственная ситуация, в которой можно использовать несвязанный универсальный тип в C # в операторе Typeof. Для доступа к несвязанному типу или закрытому типу вы бы сделали:

Type listOfT = typeof(List<>); // unbound type
Type listOfString = typeof(List<string>); // closed bound type
Type listOfInt32 = typeof(List<int>); // closed bound type

Assert.IsTrue(listOfString.IsGenericType);

Assert.AreEqual(typeof(string), listOfString.GetGenericTypeParameters()[0]);
Assert.AreEqual(typeof(List<>), listOfString.GetGenericTypeDefinition());

Type setOfString = typeof(HashSet<string>);

Assert.AreNotEqual(typeof(List<>), setOfString.GetGenericTypeDefinition());
8
ответ дан 18 December 2019 в 11:56
поделиться

На самом деле список является реальным типом во многих отношениях ( Вы можете использовать Тип (список <>) , и список не просто компилятор трюк, но трюк времени выполнения. Но вы действительно можете проверить открытый универсальный тип, через что-то вроде:

    static Type GetRawType(Type type)
    {
        return type.IsGenericType ? type.GetGenericTypeDefinition() : type;
    }
    static void Main()
    {
        List<int> list1 = new List<int>();
        List<string> list2 = new List<string>();
        Type type1 = GetRawType(list1.GetType()),
            type2 = GetRawType(list2.GetType());
        Console.WriteLine(type1 == type2); // true
    }
5
ответ дан 18 December 2019 в 11:56
поделиться

Вызов GetGenericTypeDefinition:

    List<string> l1 = new List<string>();
    List<int> l2 = new List<int>();
    Type t1 = l1.GetType().GetGenericTypeDefinition();
    Type t2 = l2.GetType().GetGenericTypeDefinition();
    Console.Write(t1 == t2);//output: true;
1
ответ дан 18 December 2019 в 11:56
поделиться

Попробуйте:

typeof(List<string>).GetGenericTypeDefinition() == typeof(List<int>).GetGenericTypeDefinition()

(см. http://msdn.microsoft.com/en-us/library/system.type.getgeneerictypedefinition.aspx )

1
ответ дан 18 December 2019 в 11:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: