对类型约束的反思

时间:2011-03-25 13:07:42

标签: c# types constraints

在类和方法定义中,可以添加where T : IFoo等类型约束。

是否可以使用System.TypeMethodInfo反映这些约束?到目前为止我还没有找到任何东西;任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:22)

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

您可以使用以下方式执行此操作:

    <{3}}的{li> Type.GetGenericArguments来查找该类型的泛型参数,即。 Type<T>,您会找到T
  • Type为您提供了每个此类参数所受约束的基本类型,您可以在上述方法中找到的参数上调用它。

请查看此代码,您可以通过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属性也返回单个类型约束。