在类和方法定义中,可以添加where T : IFoo
等类型约束。
是否可以使用System.Type
或MethodInfo
反映这些约束?到目前为止我还没有找到任何东西;任何帮助将不胜感激。
答案 0 :(得分:22)
您可以将通用参数迭代到类型,并且对于每个参数,您可以要求约束类型。
您可以使用以下方式执行此操作:
Type<T>
,您会找到T
。
请查看此代码,您可以通过Type.GetGenericParameterConstraints:
运行该代码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
答案 1 :(得分:4)
您可以使用GetGenericParameterConstraints()方法执行此操作。
答案 2 :(得分:2)
使用之前找到的System.Type
,您可以使用GetGenericParameterConstraints()
。
以下是关于Generics and Reflection的优秀MSDN文章。
答案 3 :(得分:0)
Lasse的answer指出了相关的Type
方法。我在创建此扩展方法时将其用作参考:
public static IList<Tuple<Type, Type[], GenericParameterAttributes>> GetTypeConstraints( this Type type )
{
return type.GetGenericArguments()
.Select( t => Tuple.Create( t, t.GetGenericParameterConstraints(), t.GenericParameterAttributes ) )
.Where( t => t.Item2.Length > 0 || t.Item3 > GenericParameterAttributes.None )
.ToList();
}
有趣的是,似乎泛型参数的Type.BaseType
属性也返回单个类型约束。