Ответ 1
Вы можете выполнять итерацию по общим параметрам по типу, и для каждого параметра вы можете запросить типы ограничений.
Вы делаете это, используя:
- Type.GetGenericArguments Type, чтобы найти общие аргументы типа, т.е.
Type<T>
, вы найдетеT
. - Type.GetGenericParameterConstraints дает вам базовые типы, с которыми связан каждый такой параметр, вы вызываете это по аргументам, которые вы найдете по приведенному выше методу.
Взгляните на этот код, который вы можете выполнить через 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