エクスポート (0) 印刷
すべて展開
情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

GenericParameterAttributes 列挙体

2013/12/12

ジェネリック型またはジェネリック メソッドのジェネリック型パラメーターに関する制約を表します。

この列挙体には、メンバー値のビットごとの組み合わせを可能にする FlagsAttribute 属性が含まれています。

Namespace:  System.Reflection
アセンブリ:  mscorlib (mscorlib.dll 内)

[FlagsAttribute]
public enum GenericParameterAttributes

メンバー名説明
Contravariantジェネリック型パラメーターが反変の型パラメーターです。反変の型パラメーターは、メソッドのシグネチャのパラメーター型として現れます。
Covariantジェネリック型パラメーターが共変の型パラメーターです。共変の型パラメーターは、メソッドの結果型、読み取り専用フィールドの型、宣言された基本型、または実装されたインターフェイスとして現れます。
DefaultConstructorConstraint型がパラメーターなしのコンストラクターを持つ場合のみ、その型をジェネリック型パラメーターの代わりに使用できます。
None特別なフラグはありません。
NotNullableValueTypeConstraint型が値型で null 許容でない場合のみ、その型をジェネリック型パラメーターの代わりに使用できます。
ReferenceTypeConstraint型が参照型である場合のみ、その型をジェネリック型パラメーターの代わりに使用できます。
SpecialConstraintMaskすべての特殊な制約フラグの組み合わせを選択します。この値は、論理 OR を使用して次のフラグを組み合わせた結果です。DefaultConstructorConstraintReferenceTypeConstraint、および NotNullableValueTypeConstraint
VarianceMaskすべての変性フラグの組み合わせを選択します。この値は、論理 OR を使用して次のフラグを組み合わせた結果です。Contravariant および Covariant

GenericParameterAttributes 列挙体のメンバーは、変性グループおよび特殊な制約グループという、2 つのグループに分けられます。変性フラグの GenericParameterAttributes 値をテストするには、最初に VarianceMask を使用してビットごとの AND 演算を実行します。結果が None である場合、変性フラグはありません。同様に、制約フラグのテストには SpecialConstraintMask を使用します。

2 つの型パラメーターを使用して Test というジェネリック型を定義するコード例を次に示します。2 つ目の型パラメーターでは、基本クラスの制約と参照型の制約が指定されます。プログラムの実行時に、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

表示:
© 2015 Microsoft