【问题标题】:Reflection over Type Constraints对类型约束的反思
【发布时间】:2011-07-22 21:56:40
【问题描述】:

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

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

【问题讨论】:

    标签: c# types constraints


    【解决方案1】:

    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 属性似乎也返回单个类型约束。

    【讨论】:

      【解决方案2】:

      你可以遍历泛型参数到类型,并且对于每个参数,你可以请求约束类型。

      您可以使用:

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

      【讨论】:

        【解决方案3】:

        使用以前找到的System.Type,您可以使用GetGenericParameterConstraints()

        这是 Generics and Reflection 上一篇出色的 MSDN 文章。

        【讨论】:

          【解决方案4】:

          您可以使用GetGenericParameterConstraints() 方法来做到这一点。

          【讨论】:

            猜你喜欢
            • 2012-01-06
            • 2012-12-29
            • 2011-01-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多