정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Type.GenericParameterAttributes 속성

2013-12-13

현재 제네릭 형식 매개 변수의 공 분산과 특수 제약 조건을 설명하는 GenericParameterAttributes 플래그의 조합을 가져옵니다.

Namespace:  System
어셈블리:  mscorlib(mscorlib.dll)

public virtual GenericParameterAttributes GenericParameterAttributes { get; }

속성 값

형식: System.Reflection.GenericParameterAttributes
현재 제네릭 형식 매개 변수의 공 분산 및 특수 제약 조건을 설명하는 GenericParameterAttributes 값의 비트 조합입니다.

예외조건
InvalidOperationException

현재 Type 개체가 제네릭 형식 매개 변수가 아닌 경우. 즉, IsGenericParameter 속성이 false를 반환하는 경우

NotSupportedException

호출된 메서드가 기본 클래스에서 지원되지 않는 경우

이 속성의 값에는 현재 제네릭 형식 매개 변수가 공변인지 여부를 설명하는 플래그와 특수 제약 조건을 설명하는 플래그가 포함되어 있습니다. GenericParameterAttributes.VarianceMask 값을 사용하여 공 분산 플래그를 선택하고 GenericParameterAttributes.SpecialConstraintMask 값을 사용하여 제약 조건 플래그를 선택합니다.

제네릭 리플렉션에 사용되는 용어에 대한 고정 조건 목록은 IsGenericType 속성 설명을 참조하세요.

다음 코드 예제에서는 제약 조건이 서로 다른 두 가지 형식 매개 변수가 있는 제네릭 형식 Test를 정의합니다. 프로그램이 실행되면 GenericParameterAttributes 속성 및 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

표시: