本文由机器翻译。若要查看英语原文,请勾选“英语”复选框。 也可将鼠标指针移到文本上,在弹出窗口中显示英语原文。
翻译
英语

Type.ContainsGenericParameters 属性

 

获取一个值,该值指示当前 Type 对象是否具有尚未被特定类型替代的类型参数。

命名空间:   System
程序集:  mscorlib(位于 mscorlib.dll)

public virtual bool ContainsGenericParameters { get; }

属性值

Type: System.Boolean

如果 true 对象本身是泛型类型形参或者具有尚未提供特定类型的类型形参,则为 Type;否则为 false

若要创建类型的实例,必须有任何泛型类型定义或该类型本身中任何封闭泛型类型,或在任何元素中的类型中的类型参数的开放式构造的类型。 另一种说法是,当检查以递归方式,该类型必须包含任何泛型类型参数。

由于类型可以为任意复杂,在进行此决定会很困难。 为了方便起见和降低错误的可能性ContainsGenericParameters属性提供一种标准的方式来区分封闭式构造类型,可实例化,和开放构造类型,不能。 如果ContainsGenericParameters属性返回true,类型不能被实例化。

ContainsGenericParameters 属性类型参数的以递归方式搜索。 例如,它返回true一个数组,其元素是类型为A<T>(A(Of T)在 Visual Basic 中),即使数组本身不是泛型。 与此相反的行为IsGenericType属性,它返回false数组。

示例类和显示的值的表的一组ContainsGenericParameters属性,请参阅IsGenericType

下面的示例定义具有两个类型参数的泛型类,然后定义派生自的第一个类的第二个泛型类。 派生的类的基类具有两个类型参数︰ 第一种是Int32和第二个是派生类型的类型参数。 该示例显示有关这些泛型类的信息,包括位置报告的GenericParameterPosition属性。

using System;
using System.Reflection;
using System.Collections.Generic;

// Define a base class with two type parameters.
public class Base<T, U> { }

// Define a derived class. The derived class inherits from a constructed
// class that meets the following criteria:
//   (1) Its generic type definition is Base<T, U>.
//   (2) It specifies int for the first type parameter.
//   (3) For the second type parameter, it uses the same type that is used
//       for the type parameter of the derived class.
// Thus, the derived class is a generic type with one type parameter, but
// its base class is an open constructed type with one type argument and
// one type parameter.
public class Derived<V> : Base<int, V> { }

public class Test
{
    public static void Main()
    {
        Console.WriteLine(
            "\r\n--- Display a generic type and the open constructed");
        Console.WriteLine("    type from which it is derived.");

        // Create a Type object representing the generic type definition 
        // for the Derived type, by omitting the type argument. (For
        // types with multiple type parameters, supply the commas but
        // omit the type arguments.) 
        //
        Type derivedType = typeof(Derived<>);
        DisplayGenericTypeInfo(derivedType);

        // Display its open constructed base type.
        DisplayGenericTypeInfo(derivedType.BaseType);
    }

    private static void DisplayGenericTypeInfo(Type t)
    {
        Console.WriteLine("\r\n{0}", t);

        Console.WriteLine("\tIs this a generic type definition? {0}", 
            t.IsGenericTypeDefinition);

        Console.WriteLine("\tIs it a generic type? {0}", 
            t.IsGenericType);

        Console.WriteLine("\tDoes it have unassigned generic parameters? {0}", 
            t.ContainsGenericParameters);

        if (t.IsGenericType)
        {
            // If this is a generic type, display the type arguments.
            //
            Type[] typeArguments = t.GetGenericArguments();

            Console.WriteLine("\tList type arguments ({0}):", 
                typeArguments.Length);

            foreach (Type tParam in typeArguments)
            {
                // IsGenericParameter is true only for generic type
                // parameters.
                //
                if (tParam.IsGenericParameter)
                {
                    Console.WriteLine(
                        "\t\t{0}  (unassigned - parameter position {1})",
                        tParam,
                        tParam.GenericParameterPosition);
                }
                else
                {
                    Console.WriteLine("\t\t{0}", tParam);
                }
            }
        }
    }
}

/* This example produces the following output:

--- Display a generic type and the open constructed
    type from which it is derived.

Derived`1[V]
        Is this a generic type definition? True
        Is it a generic type? True
        Does it have unassigned generic parameters? True
        List type arguments (1):
                V  (unassigned - parameter position 0)

Base`2[System.Int32,V]
        Is this a generic type definition? False
        Is it a generic type? True
        Does it have unassigned generic parameters? True
        List type arguments (2):
                System.Int32
                V  (unassigned - parameter position 0)
 */

.NET Framework
自 2.0 起可用
可移植类库
可移植 .NET 平台 中受支持
Silverlight
自 2.0 起可用
Windows Phone Silverlight
自 7.0 起可用
返回页首
显示: