Я предполагаю, что вы не просто хотите знать, является ли тип универсальным, но если объект является экземпляром определенного универсального типа, не зная аргументов типа.
К сожалению, не все так просто. Это не так уж плохо, если универсальный тип является классом (как в данном случае), но это сложнее для интерфейсов. Вот код для класса:
using System;
using System.Collections.Generic;
using System.Reflection;
class Test
{
static bool IsInstanceOfGenericType(Type genericType, object instance)
{
Type type = instance.GetType();
while (type != null)
{
if (type.IsGenericType &&
type.GetGenericTypeDefinition() == genericType)
{
return true;
}
type = type.BaseType;
}
return false;
}
static void Main(string[] args)
{
// True
Console.WriteLine(IsInstanceOfGenericType(typeof(List<>),
new List<string>()));
// False
Console.WriteLine(IsInstanceOfGenericType(typeof(List<>),
new string[0]));
// True
Console.WriteLine(IsInstanceOfGenericType(typeof(List<>),
new SubList()));
// True
Console.WriteLine(IsInstanceOfGenericType(typeof(List<>),
new SubList<int>()));
}
class SubList : List<string>
{
}
class SubList<T> : List<T>
{
}
}
РЕДАКТИРОВАТЬ: Как отмечено в комментариях, это может работать для интерфейсов:
foreach (var i in type.GetInterfaces())
{
if (i.IsGenericType && i.GetGenericTypeDefinition() == genericType)
{
return true;
}
}
У меня есть подлое подозрение, что могут быть какие-то неуклюжие крайние случаи вокруг этого, но я не могу найти тот, в котором сейчас не получится.