Там какой-либо путь состоит в том, чтобы сказать через отражение, что универсальный список Типа A связан с универсальным списком Типа B? Например, у меня есть a List<string>
и a List<int>
. Как я могу сказать через отражение, что оба этих типа являются 'экземплярами' List<T>
. Я думаю, что у меня есть проблема потому что List<T>
не реальный тип. Вы не можете сделать typeof(List<T>)
например. List<T>
прием компилятора, который я предполагаю. Так должен там так или иначе определить, прибывают ли два различных типов из List<T>
?
Конечно, вы можете ... Список <>
на самом деле то, что называется «несвязанным универсальным типом», что это не имеет был параметризован с типом. Когда аргумент типа указан, он называется «связанным генерическим типом». Тип, который включает в себя «необработанные» параметры типа, такие как , список
- «открытый универсальный тип», и тот, который включает в себя только фактические типы, такие как список
«Закрытый универсальный тип». Единственная ситуация, в которой можно использовать несвязанный универсальный тип в 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());
На самом деле список
является реальным типом во многих отношениях ( Вы можете использовать Тип
(список <>)
, и список
не просто компилятор трюк, но трюк времени выполнения. Но вы действительно можете проверить открытый универсальный тип, через что-то вроде:
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
}
Вызов 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;
Попробуйте:
typeof(List<string>).GetGenericTypeDefinition() == typeof(List<int>).GetGenericTypeDefinition()
(см. http://msdn.microsoft.com/en-us/library/system.type.getgeneerictypedefinition.aspx )