展开 最小化

GenericParameterAttributes 枚举

2013/12/13

描述对泛型类型或泛型方法的泛型类型参数的约束。

此枚举具有一个 FlagsAttribute 属性,该属性允许对其成员值进行按位组合。

Namespace:  System.Reflection
程序集:  mscorlib(位于 mscorlib.dll 中)

[FlagsAttribute]
public enum GenericParameterAttributes

成员名称说明
Contravariant该泛型类型参数是逆变的。逆变类型参数可以作为参数类型出现在方法签名中。
Covariant该泛型类型参数是协变的。协变类型参数可以作为方法的结果类型、只读字段的类型、声明的基类型或实现接口出现。
DefaultConstructorConstraint仅当类型具有无参数构造函数时,才能替代泛型类型参数。
None没有任何特殊标志。
NotNullableValueTypeConstraint仅当类型是值类型且不可为空时,才能替代泛型类型参数。
ReferenceTypeConstraint仅当类型为引用类型时,才能替代泛型类型参数。
SpecialConstraintMask选择所有特殊约束标志的组合。此值是使用逻辑“或”将以下标志进行组合的结果:DefaultConstructorConstraintReferenceTypeConstraintNotNullableValueTypeConstraint
VarianceMask选择所有方差标志的组合。此值是使用逻辑“或”将以下标志进行组合的结果:ContravariantCovariant

GenericParameterAttributes 枚举的成员分成两组,方差组和特殊约束组。若要测试方差标志的 GenericParameterAttributes 值,请首先与 VarianceMask 执行一次按位“与”运算。如果结果为 None,则没有任何方差标志。类似地,SpecialConstraintMask 可用于测试约束标志。

下面的代码示例用两个类型参数定义一个泛型类型 Test。第二个类型参数具有一个基类约束和一个引用类型约束。当程序执行时,使用 Type.GenericParameterAttributes 属性和 Type.GetGenericParameterConstraints 方法检查这些约束。

说明注意:

要运行此示例,请参见生成具有静态 Windows Phone TextBlock 控件的示例


using System;
using System.Reflection;

// Define a sample interface to use as an interface constraint.
public interface ITest { }

// Define a base type to use as a base class constraint.
public class Base { }

// Define the generic type to examine. The first generic type parameter,
// T, derives from the class Base and implements ITest. This demonstrates
// a base class constraint and an interface constraint. The second generic 
// type parameter, U, must be a reference type (class) and must have a 
// default constructor (new()). This demonstrates special constraints.
//
public class Test<T, U>
   where T : Base, ITest
   where U : class, new() { }

// Define a type that derives from Base and implements ITest. This type
// satisfies the constraints on T in class Test.
public class Derived : Base, ITest { }

public class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      // To get the generic type definition, omit the type
      // arguments but retain the comma to indicate the number
      // of type arguments. 
      //
      Type def = typeof(Test<,>);
      outputBlock.Text += String.Format("\r\nExamining generic type {0}", def) + "\n";

      // Get the type parameters of the generic type definition,
      // and display them.
      //
      Type[] defparams = def.GetGenericArguments();
      foreach (Type tp in defparams)
      {
         outputBlock.Text += String.Format("\r\nType parameter: {0}", tp.Name) + "\n";
         outputBlock.Text += String.Format("\t{0}",
             ListGenericParameterAttributes(tp)) + "\n";

         // List the base class and interface constraints. The
         // constraints are returned in no particular order. If 
         // there are no class or interface constraints, an empty
         // array is returned.
         //
         Type[] tpConstraints = tp.GetGenericParameterConstraints();
         foreach (Type tpc in tpConstraints)
         {
            outputBlock.Text += String.Format("\t{0}", tpc) + "\n";
         }
      }
   }

   // List the variance and special constraint flags. 
   //
   private static string ListGenericParameterAttributes(Type t)
   {
      string retval;
      GenericParameterAttributes gpa = t.GenericParameterAttributes;
      GenericParameterAttributes variance = gpa &
          GenericParameterAttributes.VarianceMask;

      // Select the variance flags.
      if (variance == GenericParameterAttributes.None)
         retval = "No variance flag;";
      else
      {
         if ((variance & GenericParameterAttributes.Covariant) != 0)
            retval = "Covariant;";
         else
            retval = "Contravariant;";
      }

      // Select 
      GenericParameterAttributes constraints = gpa &
          GenericParameterAttributes.SpecialConstraintMask;

      if (constraints == GenericParameterAttributes.None)
         retval += " No special constraints";
      else
      {
         if ((constraints & GenericParameterAttributes.ReferenceTypeConstraint) != 0)
            retval += " ReferenceTypeConstraint";
         if ((constraints & GenericParameterAttributes.NotNullableValueTypeConstraint) != 0)
            retval += " NotNullableValueTypeConstraint";
         if ((constraints & GenericParameterAttributes.DefaultConstructorConstraint) != 0)
            retval += " DefaultConstructorConstraint";
      }

      return retval;
   }
}
/* This example produces the following output:

Examining generic type Test`2[T,U]

Type parameter: T
        No variance flag; no special constraints.
        Base
        ITest

Type parameter: U
        No variance flag; ReferenceTypeConstraint DefaultConstructorConstraint
 */


Windows Phone OS

受以下版本支持: 8.0, 7.1, 7.0

Windows Phone

显示:
© 2014 Microsoft