2011-03-25 100 views
16

在类和方法定义中,可以添加类型约束,如where T : IFoo类型约束的反射

是否可以通过System.TypeMethodInfo来反映这些限制?到目前为止我还没有发现任何东西;任何帮助将不胜感激。

回答

19

您可以迭代通用参数到类型,并且对于每个参数,您可以要求输入约束类型。

你做到这一点使用:

看看这段代码,您可以通过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
+0

非常感谢!大! – 2011-03-25 13:29:12

2

使用先前发现System.Type可以使用GetGenericParameterConstraints()

这是关于Generics and Reflection的优秀MSDN文章。

+0

非常感谢! – 2011-03-25 13:26:55

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财产上通用的参数也返回一个类型约束。