Вы можете перебирать универсальные параметры для типа, и для каждого параметра вы можете запрашивать типы ограничений.
Вы делаете это, используя:
Посмотрите на этот код, который вы можете запустить через LINQPad :
void Main()
{
Type type = typeof(TestClass<>);
foreach (var parm in type.GetGenericArguments())
{
Debug.WriteLine(parm.Name);
parm.GetGenericParameterConstraints().Dump();
}
}
public class TestClass<T>
where T : Stream
{
}
Вывод:
T
Type [] (1 item)
typeof (Stream)
Чтобы найти другие ограничения, такие как new()
, вы можете использовать перечисление флагов .GenericParameterAttributes
, например:
void Main()
{
Type type = typeof(TestClass<>);
foreach (var parm in type.GetGenericArguments())
{
Debug.WriteLine(parm.Name);
parm.GetGenericParameterConstraints().Dump();
parm.GenericParameterAttributes.Dump();
}
}
public class TestClass<T>
where T : new()
{
}
Какие выходные данные:
T
Type [] (1 item)
typeof (Stream)
DefaultConstructorConstraint