Azureはじめました

Windows Azureで業務システムを組んでみる日記

Typeにやたら沢山あるGeneric系メンバってナンジャラホイ。


このサンプルが一番わかりやすい。
Type.ContainsGenericParameters プロパティ (System)

public class Base<T, U> { }
public class Derived<V> : Base<int, V> { }


public class Test
{
    public static void Main()
    {
        Type derivedType = typeof(Derived<>);
        DisplayGenericTypeInfo(derivedType);
        DisplayGenericTypeInfo(derivedType.BaseType);
    }

    private static void DisplayGenericTypeInfo(Type 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)
        {
            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)
 */

ここから、

IsGenericType
TypeがGenericであるか*1
IsGenericTypeDefinition
Typeが Class<T>などの不確定型を持つ定義になっているか*2
ContainsGenericParameters
Typeが Class<T>などの不確定型のパラメータを持つか
IsGenericParameter
Class<T>のTのような不確定型パラメータか

という感じっぽい。

*1:class of classの形になっているか

*2:Type.IsGenericTypeDefinition プロパティ (System)