在类和方法定义中,可以添加类型约束,如where T : IFoo
。类型约束的反射
是否可以通过System.Type
或MethodInfo
来反映这些限制?到目前为止我还没有发现任何东西;任何帮助将不胜感激。
在类和方法定义中,可以添加类型约束,如where T : IFoo
。类型约束的反射
是否可以通过System.Type
或MethodInfo
来反映这些限制?到目前为止我还没有发现任何东西;任何帮助将不胜感激。
您可以迭代通用参数到类型,并且对于每个参数,您可以要求输入约束类型。
你做到这一点使用:
Type<T>
,你会发现T
。看看这段代码,您可以通过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
使用先前发现System.Type
可以使用GetGenericParameterConstraints()
。
这是关于Generics and Reflection的优秀MSDN文章。
非常感谢! – 2011-03-25 13:26:55
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
财产上通用的参数也返回一个类型约束。
非常感谢!大! – 2011-03-25 13:29:12