情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Type.ContainsGenericParameters プロパティ

2013/12/12

現在の Type オブジェクトが特定の型で置き換えられていない型パラメーターを持っているどうかを示す値を取得します。

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

public virtual bool ContainsGenericParameters { get; }

プロパティ値

型: System.Boolean
Type オブジェクト自体がジェネリック型パラメーターであるか、特定の型が指定されていない型パラメーターを持っている場合は true。そうでない場合は false

型のインスタンスを作成する場合は、包含するジェネリック型の中、または型の要素の中で、型そのものの型引数にジェネリック型定義またはオープン構築型が存在しないことが必須条件です。つまり、再帰的に調べたときに、型にジェネリック型パラメーターが含まれていることは許容されません。

型が複雑になると、判断が困難な場合があります。ContainsGenericParameters プロパティは、インスタンス化できるクローズ構築型とインスタンス化できないオープン構築型を区別する標準的な方法を提供します。これは便利な方法であり、エラーの可能性も低くなります。ContainsGenericParameters プロパティが true を返す場合、型はインスタンス化できません。

ContainsGenericParameters プロパティは、型パラメーターを再帰的に検索します。たとえば、要素の型が A<T> (Visual Basic の場合は A(Of T)) である配列に対して、配列そのものがジェネリック型でなくても true を返します。これは、配列に対して false を返す IsGenericType プロパティの動作とは異なります。

ContainsGenericParameters プロパティの値を示すクラスの例および表については、IsGenericType のトピックを参照してください。

2 つの型パラメーターを指定したジェネリック クラス、および最初のクラスから派生する 2 番目のジェネリック クラスを定義する例を次に示します。派生クラスの基本クラスには 2 つの型引数があります。1 番目は Int32 であり、2 番目は派生型の型パラメーターです。この例では、GenericParameterPosition プロパティによって報告された位置を含む、ジェネリック クラスの情報が示されています。

メモメモ:

この例を実行するには、「Windows Phone での静的 TextBlock コントロールのあるコード例のビルド」を参照してください。


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 Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      outputBlock.Text +=
          "\r\n--- Display a generic type and the open constructed" + "\n";
      outputBlock.Text += "    type from which it is derived." + "\n";

      // 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(outputBlock, derivedType);

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

   private static void DisplayGenericTypeInfo(System.Windows.Controls.TextBlock outputBlock, Type t)
   {
      outputBlock.Text += String.Format("\r\n{0}", t) + "\n";

      outputBlock.Text += String.Format("\tIs this a generic type definition? {0}",
          t.IsGenericTypeDefinition) + "\n";

      outputBlock.Text += String.Format("\tIs it a generic type? {0}",
          t.IsGenericType) + "\n";

      outputBlock.Text += String.Format("\tDoes it have unassigned generic parameters? {0}",
          t.ContainsGenericParameters) + "\n";

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

         outputBlock.Text += String.Format("\tList type arguments ({0}):",
             typeArguments.Length) + "\n";

         foreach (Type tParam in typeArguments)
         {
            // IsGenericParameter is true only for generic type
            // parameters.
            //
            if (tParam.IsGenericParameter)
            {
               outputBlock.Text += String.Format(
                   "\t\t{0}  (unassigned - parameter position {1})",
                   tParam,
                   tParam.GenericParameterPosition) + "\n";
            }
            else
            {
               outputBlock.Text += String.Format("\t\t{0}", tParam) + "\n";
            }
         }
      }
   }
}

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


Windows Phone OS

サポート: 8.0, 7.1, 7.0

表示: