信息
您所需的主题如下所示。但此主题未包含在此库中。

GenericParameterAttributes 枚举

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

此枚举有一个 FlagsAttribute 特性,通过该特性可使其成员值按位组合。

命名空间:  System.Reflection
程序集:  mscorlib(在 mscorlib.dll 中)

[FlagsAttribute]
public enum GenericParameterAttributes

成员名称说明
ms145349.PortableClassLibrary(zh-cn,VS.100).gifNone没有任何特殊标志。
ms145349.PortableClassLibrary(zh-cn,VS.100).gifVarianceMask选择所有方差标志的组合。 此值是使用逻辑“或”将标志 ContravariantCovariant 进行组合的结果。
ms145349.PortableClassLibrary(zh-cn,VS.100).gifCovariant该泛型类型参数是协变的。 协变类型参数可以作为方法的结果类型、只读字段的类型、声明的基类型或实现接口出现。
ms145349.PortableClassLibrary(zh-cn,VS.100).gifContravariant该泛型类型参数是逆变的。 逆变类型参数可以作为参数类型出现在方法签名中。
ms145349.PortableClassLibrary(zh-cn,VS.100).gifSpecialConstraintMask选择所有特殊约束标志的组合。 此值是使用逻辑“或”将标志 DefaultConstructorConstraintReferenceTypeConstraintNotNullableValueTypeConstraint 进行组合的结果。
ms145349.PortableClassLibrary(zh-cn,VS.100).gifReferenceTypeConstraint仅当类型为引用类型时,才能替代泛型类型参数。
ms145349.PortableClassLibrary(zh-cn,VS.100).gifNotNullableValueTypeConstraint仅当类型是值类型且不可为空时,才能替代泛型类型参数。
ms145349.PortableClassLibrary(zh-cn,VS.100).gifDefaultConstructorConstraint仅当类型具有无参数构造函数时,才能替代泛型类型参数。

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

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


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 Main()
    {
        // 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<,>);
        Console.WriteLine("\r\nExamining generic type {0}", def);

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

            // 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)
            {
                Console.WriteLine("\t{0}", tpc);
            }
        }
    }

    // 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
 */


.NET Framework

受以下版本支持:4、3.5、3.0、2.0

.NET Framework Client Profile

受以下版本支持:4、3.5 SP1

受以下版本支持:

Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2

.NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求

社区附加资源

显示:
© 2014 Microsoft