【发布时间】:2011-07-22 21:56:40
【问题描述】:
在类和方法定义中,可以添加类型约束,例如where T : IFoo。
是否可以用System.Type 或MethodInfo 反映这些约束?到目前为止我还没有找到任何东西;任何帮助将不胜感激。
【问题讨论】:
标签: c# types constraints
在类和方法定义中,可以添加类型约束,例如where T : IFoo。
是否可以用System.Type 或MethodInfo 反映这些约束?到目前为止我还没有找到任何东西;任何帮助将不胜感激。
【问题讨论】:
标签: c# types constraints
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 属性似乎也返回单个类型约束。
【讨论】:
你可以遍历泛型参数到类型,并且对于每个参数,你可以请求约束类型。
您可以使用:
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
{
}
输出是:
吨 类型 [](1 项) 类型(流)要查找其他约束,例如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()
{
}
哪些输出:
吨 类型 [](1 项) 类型(流) DefaultConstructorConstraint【讨论】:
使用以前找到的System.Type,您可以使用GetGenericParameterConstraints()。
这是 Generics and Reflection 上一篇出色的 MSDN 文章。
【讨论】:
您可以使用GetGenericParameterConstraints() 方法来做到这一点。
【讨论】: