GenericTypeParameterBuilder クラス
アセンブリ: mscorlib (mscorlib.dll 内)


TypeBuilder.DefineGenericParameters メソッドを使用して、型パラメータを動的型に追加し、動的型をジェネリック型にするか、MethodBuilder.DefineGenericParameters メソッドを使用して、型パラメータを動的メソッドに追加することによって、GenericTypeParameterBuilder オブジェクトの配列を取得できます。GenericTypeParameterBuilder オブジェクトを使用して、型パラメータに制約を加えます。次の 3 種類の制約があります。
-
基本型の制約では、ジェネリック型パラメータに割り当てる型は、特定の基本型から派生する必要があることを指定します。この制約は、SetBaseTypeConstraint メソッドを使用して設定します。
-
インターフェイスの制約では、ジェネリック型パラメータに割り当てる型は、特定のインターフェイスを実装する必要があることを指定します。インターフェイスの制約は、SetInterfaceConstraints メソッドを使用して設定します。
-
特殊な制約では、ジェネリック型パラメータに割り当てる型は、既定のコンストラクタを持つ必要があること、参照型である必要があること、または値型である必要があることを指定します。型パラメータの特殊な制約は、SetGenericParameterAttributes メソッドを使用して設定します。
インターフェイスの制約と特殊な制約は、GenericTypeParameterBuilder クラスのメソッドを使用して取得することはできません。型パラメータを含むジェネリック型を作成すると、その Type オブジェクトを使用して制約をリフレクションできるようになります。Type.GetGenericArguments メソッドを使用して型パラメータを取得し、各型パラメータに対して、Type.GetGenericParameterConstraints メソッドを使用して基本型の制約とインターフェイスの制約を取得します。特殊な制約を取得するには、Type.GenericParameterAttributes プロパティを使用します。

2 つの型パラメータを持つジェネリック型を作成し、アセンブリ GenericEmitExample1.dll に保存するコード例を次に示します。MSIL 逆アセンブラ (Ildasm.exe) を使用して、生成された型を表示できます。動的ジェネリック型の定義に関連する手順の詳細については、「方法 : リフレクション出力を使用してジェネリック型を定義する」を参照してください。
Imports System Imports System.Reflection Imports System.Reflection.Emit Imports System.Collections.Generic ' Define a trivial base class and two trivial interfaces ' to use when demonstrating constraints. ' Public Class ExampleBase End Class Public Interface IExampleA End Interface Public Interface IExampleB End Interface ' Define a trivial type that can substitute for type parameter ' TSecond. ' Public Class ExampleDerived Inherits ExampleBase Implements IExampleA, IExampleB End Class Public Class Example Public Shared Sub Main() ' Define a dynamic assembly to contain the sample type. The ' assembly will not be run, but only saved to disk, so ' AssemblyBuilderAccess.Save is specified. ' Dim myDomain As AppDomain = AppDomain.CurrentDomain Dim myAsmName As New AssemblyName("GenericEmitExample1") Dim myAssembly As AssemblyBuilder = myDomain.DefineDynamicAssembly( _ myAsmName, _ AssemblyBuilderAccess.RunAndSave) ' An assembly is made up of executable modules. For a single- ' module assembly, the module name and file name are the same ' as the assembly name. ' Dim myModule As ModuleBuilder = myAssembly.DefineDynamicModule( _ myAsmName.Name, _ myAsmName.Name & ".dll") ' Get type objects for the base class trivial interfaces to ' be used as constraints. ' Dim baseType As Type = GetType(ExampleBase) Dim interfaceA As Type = GetType(IExampleA) Dim interfaceB As Type = GetType(IExampleB) ' Define the sample type. ' Dim myType As TypeBuilder = myModule.DefineType( _ "Sample", _ TypeAttributes.Public) Console.WriteLine("Type 'Sample' is generic: {0}", _ myType.IsGenericType) ' Define type parameters for the type. Until you do this, ' the type is not generic, as the preceding and following ' WriteLine statements show. The type parameter names are ' specified as an array of strings. To make the code ' easier to read, each GenericTypeParameterBuilder is placed ' in a variable with the same name as the type parameter. ' Dim typeParamNames() As String = {"TFirst", "TSecond"} Dim typeParams() As GenericTypeParameterBuilder = _ myType.DefineGenericParameters(typeParamNames) Dim TFirst As GenericTypeParameterBuilder = typeParams(0) Dim TSecond As GenericTypeParameterBuilder = typeParams(1) Console.WriteLine("Type 'Sample' is generic: {0}", _ myType.IsGenericType) ' Apply constraints to the type parameters. ' ' A type that is substituted for the first parameter, TFirst , ' must be a reference type and must have a parameterless ' constructor. TFirst.SetGenericParameterAttributes( _ GenericParameterAttributes.DefaultConstructorConstraint _ Or GenericParameterAttributes.ReferenceTypeConstraint) ' A type that is substituted for the second type ' parameter must implement IExampleA and IExampleB, and ' inherit from the trivial test class ExampleBase. The ' interface constraints are specified as an array ' containing the interface types. TSecond.SetBaseTypeConstraint(baseType) Dim interfaceTypes() As Type = {interfaceA, interfaceB} TSecond.SetInterfaceConstraints(interfaceTypes) ' The following code adds a private field named ExampleField , ' of type TFirst. Dim exField As FieldBuilder = _ myType.DefineField("ExampleField", TFirst, _ FieldAttributes.Private) ' Define a Shared method that takes an array of TFirst and ' returns a List(Of TFirst) containing all the elements of ' the array. To define this method it is necessary to create ' the type List(Of TFirst) by calling MakeGenericType on the ' generic type definition, List(Of T). (The T is omitted with ' the GetType operator when you get the generic type ' definition.) The parameter type is created by using the ' MakeArrayType method. ' Dim listOf As Type = GetType(List(Of )) Dim listOfTFirst As Type = listOf.MakeGenericType(TFirst) Dim mParamTypes() As Type = { TFirst.MakeArrayType() } Dim exMethod As MethodBuilder = _ myType.DefineMethod("ExampleMethod", _ MethodAttributes.Public Or MethodAttributes.Static, _ listOfTFirst, _ mParamTypes) ' Emit the method body. ' The method body consists of just three opcodes, to load ' the input array onto the execution stack, to call the ' List(Of TFirst) constructor that takes IEnumerable(Of TFirst) , ' which does all the work of putting the input elements into ' the list, and to return, leaving the list on the stack. The ' hard work is getting the constructor. ' ' The GetConstructor method is not supported on a ' GenericTypeParameterBuilder, so it is not possible to get ' the constructor of List(Of TFirst) directly. There are two ' steps, first getting the constructor of List(Of T) and then ' calling a method that converts it to the corresponding ' constructor of List(Of TFirst). ' ' The constructor needed here is the one that takes an ' IEnumerable(Of T). Note, however, that this is not the ' generic type definition of IEnumerable(Of T); instead, the ' T from List(Of T) must be substituted for the T of ' IEnumerable(Of T). (This seems confusing only because both ' types have type parameters named T. That is why this example ' uses the somewhat silly names TFirst and TSecond.) To get ' the type of the constructor argument, take the generic ' type definition IEnumerable(Of T) (expressed as ' IEnumerable(Of ) when you use the GetType operator) and ' call MakeGenericType with the first generic type parameter ' of List(Of T). The constructor argument list must be passed ' as an array, with just one argument in this case. ' ' Now it is possible to get the constructor of List(Of T), ' using GetConstructor on the generic type definition. To get ' the constructor of List(Of TFirst), pass List(Of TFirst) and ' the constructor from List(Of T) to the static ' TypeBuilder.GetConstructor method. ' Dim ilgen As ILGenerator = exMethod.GetILGenerator() Dim ienumOf As Type = GetType(IEnumerable(Of )) Dim listOfTParams() As Type = listOf.GetGenericArguments() Dim TfromListOf As Type = listOfTParams(0) Dim ienumOfT As Type = ienumOf.MakeGenericType(TfromListOf) Dim ctorArgs() As Type = { ienumOfT } Dim ctorPrep As ConstructorInfo = _ listOf.GetConstructor(ctorArgs) Dim ctor As ConstructorInfo = _ TypeBuilder.GetConstructor(listOfTFirst, ctorPrep) ilgen.Emit(OpCodes.Ldarg_0) ilgen.Emit(OpCodes.Newobj, ctor) ilgen.Emit(OpCodes.Ret) ' Create the type and save the assembly. Dim finished As Type = myType.CreateType() myAssembly.Save(myAsmName.Name & ".dll") ' Invoke the method. ' ExampleMethod is not generic, but the type it belongs to is ' generic, so in order to get a MethodInfo that can be invoked ' it is necessary to create a constructed type. The Example ' class satisfies the constraints on TFirst, because it is a ' reference type and has a default constructor. In order to ' have a class that satisfies the constraints on TSecond, ' this code example defines the ExampleDerived type. These ' two types are passed to MakeGenericMethod to create the ' constructed type. ' Dim typeArgs() As Type = _ { GetType(Example), GetType(ExampleDerived) } Dim constructed As Type = finished.MakeGenericType(typeArgs) Dim mi As MethodInfo = constructed.GetMethod("ExampleMethod") ' Create an array of Example objects, as input to the generic ' method. This array must be passed as the only element of an ' array of arguments. The first argument of Invoke is ' Nothing, because ExampleMethod is Shared. Display the count ' on the resulting List(Of Example). ' Dim input() As Example = { New Example(), New Example() } Dim arguments() As Object = { input } Dim listX As List(Of Example) = mi.Invoke(Nothing, arguments) Console.WriteLine(vbLf & _ "There are {0} elements in the List(Of Example).", _ listX.Count _ ) DisplayGenericParameters(finished) End Sub Private Shared Sub DisplayGenericParameters(ByVal t As Type) If Not t.IsGenericType Then Console.WriteLine("Type '{0}' is not generic.") Return End If If Not t.IsGenericTypeDefinition Then _ t = t.GetGenericTypeDefinition() Dim typeParameters() As Type = t.GetGenericArguments() Console.WriteLine(vbCrLf & _ "Listing {0} type parameters for type '{1}'.", _ typeParameters.Length, t) For Each tParam As Type In typeParameters Console.WriteLine(vbCrLf & "Type parameter {0}:", _ tParam.ToString()) For Each c As Type In tParam.GetGenericParameterConstraints() If c.IsInterface Then Console.WriteLine(" Interface constraint: {0}", c) Else Console.WriteLine(" Base type constraint: {0}", c) End If Next ListConstraintAttributes(tParam) Next tParam End Sub ' List the constraint flags. The GenericParameterAttributes ' enumeration contains two sets of attributes, variance and ' constraints. For this example, only constraints are used. ' Private Shared Sub ListConstraintAttributes(ByVal t As Type) ' Mask off the constraint flags. Dim constraints As GenericParameterAttributes = _ t.GenericParameterAttributes And _ GenericParameterAttributes.SpecialConstraintMask If (constraints And GenericParameterAttributes.ReferenceTypeConstraint) _ <> GenericParameterAttributes.None Then _ Console.WriteLine(" ReferenceTypeConstraint") If (constraints And GenericParameterAttributes.NotNullableValueTypeConstraint) _ <> GenericParameterAttributes.None Then _ Console.WriteLine(" NotNullableValueTypeConstraint") If (constraints And GenericParameterAttributes.DefaultConstructorConstraint) _ <> GenericParameterAttributes.None Then _ Console.WriteLine(" DefaultConstructorConstraint") End Sub End Class ' This code example produces the following output: ' 'Type 'Sample' is generic: False 'Type 'Sample' is generic: True ' 'There are 2 elements in the List(Of Example). ' 'Listing 2 type parameters for type 'Sample[TFirst,TSecond]'. ' 'Type parameter TFirst: ' ReferenceTypeConstraint ' DefaultConstructorConstraint ' 'Type parameter TSecond: ' Interface constraint: IExampleA ' Interface constraint: IExampleB ' Base type constraint: ExampleBase
using System; using System.Reflection; using System.Reflection.Emit; using System.Collections.Generic; // Define a trivial base class and two trivial interfaces // to use when demonstrating constraints. // public class ExampleBase {} public interface IExampleA {} public interface IExampleB {} // Define a trivial type that can substitute for type parameter // TSecond. // public class ExampleDerived : ExampleBase, IExampleA, IExampleB {} public class Example { public static void Main() { // Define a dynamic assembly to contain the sample type. The // assembly will not be run, but only saved to disk, so // AssemblyBuilderAccess.Save is specified. // AppDomain myDomain = AppDomain.CurrentDomain; AssemblyName myAsmName = new AssemblyName("GenericEmitExample1"); AssemblyBuilder myAssembly = myDomain.DefineDynamicAssembly(myAsmName, AssemblyBuilderAccess.RunAndSave); // An assembly is made up of executable modules. For a single- // module assembly, the module name and file name are the same // as the assembly name. // ModuleBuilder myModule = myAssembly.DefineDynamicModule(myAsmName.Name, myAsmName.Name + ".dll"); // Get type objects for the base class trivial interfaces to // be used as constraints. // Type baseType = typeof(ExampleBase); Type interfaceA = typeof(IExampleA); Type interfaceB = typeof(IExampleB); // Define the sample type. // TypeBuilder myType = myModule.DefineType("Sample", TypeAttributes.Public); Console.WriteLine("Type 'Sample' is generic: {0}", myType.IsGenericType); // Define type parameters for the type. Until you do this, // the type is not generic, as the preceding and following // WriteLine statements show. The type parameter names are // specified as an array of strings. To make the code // easier to read, each GenericTypeParameterBuilder is placed // in a variable with the same name as the type parameter. // string[] typeParamNames = {"TFirst", "TSecond"}; GenericTypeParameterBuilder[] typeParams = myType.DefineGenericParameters(typeParamNames); GenericTypeParameterBuilder TFirst = typeParams[0]; GenericTypeParameterBuilder TSecond = typeParams[1]; Console.WriteLine("Type 'Sample' is generic: {0}", myType.IsGenericType); // Apply constraints to the type parameters. // // A type that is substituted for the first parameter, TFirst , // must be a reference type and must have a parameterless // constructor. TFirst.SetGenericParameterAttributes( GenericParameterAttributes.DefaultConstructorConstraint | GenericParameterAttributes.ReferenceTypeConstraint); // A type that is substituted for the second type // parameter must implement IExampleA and IExampleB, and // inherit from the trivial test class ExampleBase. The // interface constraints are specified as an array // containing the interface types. TSecond.SetBaseTypeConstraint(baseType); Type[] interfaceTypes = {interfaceA, interfaceB}; TSecond.SetInterfaceConstraints(interfaceTypes); // The following code adds a private field named ExampleField , // of type TFirst. FieldBuilder exField = myType.DefineField("ExampleField", TFirst, FieldAttributes.Private); // Define a static method that takes an array of TFirst and // returns a List<TFirst> containing all the elements of // the array. To define this method it is necessary to create // the type List<TFirst> by calling MakeGenericType on the // generic type definition, List<T>. (The T is omitted with // the typeof operator when you get the generic type // definition.) The parameter type is created by using the // MakeArrayType method. // Type listOf = typeof(List<>); Type listOfTFirst = listOf.MakeGenericType(TFirst); Type[] mParamTypes = {TFirst.MakeArrayType()}; MethodBuilder exMethod = myType.DefineMethod("ExampleMethod", MethodAttributes.Public | MethodAttributes.Static, listOfTFirst, mParamTypes); // Emit the method body. // The method body consists of just three opcodes, to load // the input array onto the execution stack, to call the // List<TFirst> constructor that takes IEnumerable<TFirst> , // which does all the work of putting the input elements into // the list, and to return, leaving the list on the stack. The // hard work is getting the constructor. // // The GetConstructor method is not supported on a // GenericTypeParameterBuilder, so it is not possible to get // the constructor of List<TFirst> directly. There are two // steps, first getting the constructor of List<T> and then // calling a method that converts it to the corresponding // constructor of List<TFirst>. // // The constructor needed here is the one that takes an // IEnumerable<T>. Note, however, that this is not the // generic type definition of IEnumerable<T>; instead, the // T from List<T> must be substituted for the T of // IEnumerable<T>. (This seems confusing only because both // types have type parameters named T. That is why this example // uses the somewhat silly names TFirst and TSecond.) To get // the type of the constructor argument, take the generic // type definition IEnumerable<T> (expressed as // IEnumerable<> when you use the typeof operator) and // call MakeGenericType with the first generic type parameter // of List<T>. The constructor argument list must be passed // as an array, with just one argument in this case. // // Now it is possible to get the constructor of List<T> , // using GetConstructor on the generic type definition. To get // the constructor of List<TFirst>, pass List<TFirst> and // the constructor from List<T> to the static // TypeBuilder.GetConstructor method. // ILGenerator ilgen = exMethod.GetILGenerator(); Type ienumOf = typeof(IEnumerable<>); Type TfromListOf = listOf.GetGenericArguments()[0]; Type ienumOfT = ienumOf.MakeGenericType(TfromListOf); Type[] ctorArgs = {ienumOfT}; ConstructorInfo ctorPrep = listOf.GetConstructor(ctorArgs); ConstructorInfo ctor = TypeBuilder.GetConstructor(listOfTFirst, ctorPrep); ilgen.Emit(OpCodes.Ldarg_0); ilgen.Emit(OpCodes.Newobj, ctor); ilgen.Emit(OpCodes.Ret); // Create the type and save the assembly. Type finished = myType.CreateType(); myAssembly.Save(myAsmName.Name+".dll"); // Invoke the method. // ExampleMethod is not generic, but the type it belongs to is // generic, so in order to get a MethodInfo that can be invoked // it is necessary to create a constructed type. The Example // class satisfies the constraints on TFirst, because it is a // reference type and has a default constructor. In order to // have a class that satisfies the constraints on TSecond, // this code example defines the ExampleDerived type. These // two types are passed to MakeGenericMethod to create the // constructed type. // Type[] typeArgs = {typeof(Example), typeof(ExampleDerived)}; Type constructed = finished.MakeGenericType(typeArgs); MethodInfo mi = constructed.GetMethod("ExampleMethod"); // Create an array of Example objects, as input to the generic // method. This array must be passed as the only element of an // array of arguments. The first argument of Invoke is // null, because ExampleMethod is static. Display the count // on the resulting List<Example>. // Example[] input = {new Example(), new Example()}; object[] arguments = {input}; List<Example> listX = (List<Example>) mi.Invoke(null, arguments); Console.WriteLine( "\nThere are {0} elements in the List<Example>.", listX.Count); DisplayGenericParameters(finished); } private static void DisplayGenericParameters(Type t) { if (!t.IsGenericType) { Console.WriteLine("Type '{0}' is not generic."); return; } if (!t.IsGenericTypeDefinition) { t = t.GetGenericTypeDefinition(); } Type[] typeParameters = t.GetGenericArguments(); Console.WriteLine("\nListing {0} type parameters for type '{1}'.", typeParameters.Length, t); foreach( Type tParam in typeParameters ) { Console.WriteLine("\r\nType parameter {0}:", tParam.ToString()); foreach( Type c in tParam.GetGenericParameterConstraints() ) { if (c.IsInterface) { Console.WriteLine(" Interface constraint: {0}", c); } else { Console.WriteLine(" Base type constraint: {0}", c); } } ListConstraintAttributes(tParam); } } // List the constraint flags. The GenericParameterAttributes // enumeration contains two sets of attributes, variance and // constraints. For this example, only constraints are used. // private static void ListConstraintAttributes(Type t) { // Mask off the constraint flags. GenericParameterAttributes constraints = t.GenericParameterAttributes & GenericParameterAttributes.SpecialConstraintMask; if ((constraints & GenericParameterAttributes.ReferenceTypeConstraint) != GenericParameterAttributes.None) { Console.WriteLine(" ReferenceTypeConstraint"); } if ((constraints & GenericParameterAttributes.NotNullableValueTypeConstraint) != GenericParameterAttributes.None) { Console.WriteLine(" NotNullableValueTypeConstraint"); } if ((constraints & GenericParameterAttributes.DefaultConstructorConstraint) !=GenericParameterAttributes.None) { Console.WriteLine(" DefaultConstructorConstraint"); } } } /* This code example produces the following output: Type 'Sample' is generic: False Type 'Sample' is generic: True There are 2 elements in the List<Example>. Listing 2 type parameters for type 'Sample[TFirst,TSecond]'. Type parameter TFirst: ReferenceTypeConstraint DefaultConstructorConstraint Type parameter TSecond: Interface constraint: IExampleA Interface constraint: IExampleB Base type constraint: ExampleBase */
using namespace System; using namespace System::Reflection; using namespace System::Reflection::Emit; using namespace System::Collections::Generic; // Dummy class to satisfy TFirst constraints. // public ref class Example {}; // Define a trivial base class and two trivial interfaces // to use when demonstrating constraints. // public ref class ExampleBase {}; public interface class IExampleA {}; public interface class IExampleB {}; // Define a trivial type that can substitute for type parameter // TSecond. // public ref class ExampleDerived : ExampleBase, IExampleA, IExampleB {}; // List the constraint flags. The GenericParameterAttributes // enumeration contains two sets of attributes, variance and // constraints. For this example, only constraints are used. // static void ListConstraintAttributes( Type^ t ) { // Mask off the constraint flags. GenericParameterAttributes constraints = t->GenericParameterAttributes & GenericParameterAttributes::SpecialConstraintMask; if ((constraints & GenericParameterAttributes::ReferenceTypeConstraint) != GenericParameterAttributes::None) Console::WriteLine( L" ReferenceTypeConstraint"); if ((constraints & GenericParameterAttributes::NotNullableValueTypeConstraint) != GenericParameterAttributes::None) Console::WriteLine( L" NotNullableValueTypeConstraint"); if ((constraints & GenericParameterAttributes::DefaultConstructorConstraint) != GenericParameterAttributes::None) Console::WriteLine( L" DefaultConstructorConstraint"); } static void DisplayGenericParameters( Type^ t ) { if (!t->IsGenericType) { Console::WriteLine( L"Type '{0}' is not generic." ); return; } if (!t->IsGenericTypeDefinition) t = t->GetGenericTypeDefinition(); array<Type^>^ typeParameters = t->GetGenericArguments(); Console::WriteLine( L"\r\nListing {0} type parameters for type '{1}'.", typeParameters->Length, t ); for each ( Type^ tParam in typeParameters ) { Console::WriteLine( L"\r\nType parameter {0}:", tParam->ToString() ); for each (Type^ c in tParam->GetGenericParameterConstraints()) { if (c->IsInterface) Console::WriteLine( L" Interface constraint: {0}", c); else Console::WriteLine( L" Base type constraint: {0}", c); } ListConstraintAttributes(tParam); } } void main() { // Define a dynamic assembly to contain the sample type. The // assembly will be run and also saved to disk, so // AssemblyBuilderAccess.RunAndSave is specified. // AppDomain^ myDomain = AppDomain::CurrentDomain; AssemblyName^ myAsmName = gcnew AssemblyName( L"GenericEmitExample1" ); AssemblyBuilder^ myAssembly = myDomain->DefineDynamicAssembly( myAsmName, AssemblyBuilderAccess::RunAndSave ); // An assembly is made up of executable modules. For a single- // module assembly, the module name and file name are the same // as the assembly name. // ModuleBuilder^ myModule = myAssembly->DefineDynamicModule( myAsmName->Name, String::Concat( myAsmName->Name, L".dll" ) ); // Get type objects for the base class trivial interfaces to // be used as constraints. // Type^ baseType = ExampleBase::typeid; Type^ interfaceA = IExampleA::typeid; Type^ interfaceB = IExampleB::typeid; // Define the sample type. // TypeBuilder^ myType = myModule->DefineType( L"Sample", TypeAttributes::Public ); Console::WriteLine( L"Type 'Sample' is generic: {0}", myType->IsGenericType ); // Define type parameters for the type. Until you do this, // the type is not generic, as the preceding and following // WriteLine statements show. The type parameter names are // specified as an array of strings. To make the code // easier to read, each GenericTypeParameterBuilder is placed // in a variable with the same name as the type parameter. // array<String^>^typeParamNames = {L"TFirst",L"TSecond"}; array<GenericTypeParameterBuilder^>^typeParams = myType->DefineGenericParameters( typeParamNames ); GenericTypeParameterBuilder^ TFirst = typeParams[0]; GenericTypeParameterBuilder^ TSecond = typeParams[1]; Console::WriteLine( L"Type 'Sample' is generic: {0}", myType->IsGenericType ); // Apply constraints to the type parameters. // // A type that is substituted for the first parameter, TFirst, // must be a reference type and must have a parameterless // constructor. TFirst->SetGenericParameterAttributes( GenericParameterAttributes::DefaultConstructorConstraint | GenericParameterAttributes::ReferenceTypeConstraint ); // A type that is substituted for the second type // parameter must implement IExampleA and IExampleB, and // inherit from the trivial test class ExampleBase. The // interface constraints are specified as an array // containing the interface types. array<Type^>^interfaceTypes = { interfaceA, interfaceB }; TSecond->SetInterfaceConstraints( interfaceTypes ); TSecond->SetBaseTypeConstraint( baseType ); // The following code adds a private field named ExampleField, // of type TFirst. FieldBuilder^ exField = myType->DefineField("ExampleField", TFirst, FieldAttributes::Private); // Define a static method that takes an array of TFirst and // returns a List<TFirst> containing all the elements of // the array. To define this method it is necessary to create // the type List<TFirst> by calling MakeGenericType on the // generic type definition, generic<T> List. // The parameter type is created by using the // MakeArrayType method. // Type^ listOf = List::typeid; Type^ listOfTFirst = listOf->MakeGenericType(TFirst); array<Type^>^ mParamTypes = { TFirst->MakeArrayType() }; MethodBuilder^ exMethod = myType->DefineMethod("ExampleMethod", MethodAttributes::Public | MethodAttributes::Static, listOfTFirst, mParamTypes); // Emit the method body. // The method body consists of just three opcodes, to load // the input array onto the execution stack, to call the // List<TFirst> constructor that takes IEnumerable<TFirst> , // which does all the work of putting the input elements into // the list, and to return, leaving the list on the stack. The // hard work is getting the constructor. // // The GetConstructor method is not supported on a // GenericTypeParameterBuilder, so it is not possible to get // the constructor of List<TFirst> directly. There are two // steps, first getting the constructor of generic<T> List and then // calling a method that converts it to the corresponding // constructor of List<TFirst>. // // The constructor needed here is the one that takes an // IEnumerable<T>. Note, however, that this is not the // generic type definition of generic<T> IEnumerable; instead, the // T from generic<T> List must be substituted for the T of // generic<T> IEnumerable. (This seems confusing only because both // types have type parameters named T. That is why this example // uses the somewhat silly names TFirst and TSecond.) To get // the type of the constructor argument, take the generic // type definition generic<T> IEnumerable and // call MakeGenericType with the first generic type parameter // of generic<T> List. The constructor argument list must be passed // as an array, with just one argument in this case. // // Now it is possible to get the constructor of generic<T> List, // using GetConstructor on the generic type definition. To get // the constructor of List<TFirst>, pass List<TFirst> and // the constructor from generic<T> List to the static // TypeBuilder.GetConstructor method. // ILGenerator^ ilgen = exMethod->GetILGenerator(); Type^ ienumOf = IEnumerable::typeid; Type^ TfromListOf = listOf->GetGenericArguments()[0]; Type^ ienumOfT = ienumOf->MakeGenericType(TfromListOf); array<Type^>^ ctorArgs = {ienumOfT}; ConstructorInfo^ ctorPrep = listOf->GetConstructor(ctorArgs); ConstructorInfo^ ctor = TypeBuilder::GetConstructor(listOfTFirst, ctorPrep); ilgen->Emit(OpCodes::Ldarg_0); ilgen->Emit(OpCodes::Newobj, ctor); ilgen->Emit(OpCodes::Ret); // Create the type and save the assembly. Type^ finished = myType->CreateType(); myAssembly->Save( String::Concat( myAsmName->Name, L".dll" ) ); // Invoke the method. // ExampleMethod is not generic, but the type it belongs to is // generic, so in order to get a MethodInfo that can be invoked // it is necessary to create a constructed type. The Example // class satisfies the constraints on TFirst, because it is a // reference type and has a default constructor. In order to // have a class that satisfies the constraints on TSecond, // this code example defines the ExampleDerived type. These // two types are passed to MakeGenericMethod to create the // constructed type. // array<Type^>^ typeArgs = { Example::typeid, ExampleDerived::typeid }; Type^ constructed = finished->MakeGenericType(typeArgs); MethodInfo^ mi = constructed->GetMethod("ExampleMethod"); // Create an array of Example objects, as input to the generic // method. This array must be passed as the only element of an // array of arguments. The first argument of Invoke is // null, because ExampleMethod is static. Display the count // on the resulting List<Example>. // array<Example^>^ input = { gcnew Example(), gcnew Example() }; array<Object^>^ arguments = { input }; List<Example^>^ listX = (List<Example^>^) mi->Invoke(nullptr, arguments); Console::WriteLine( "\nThere are {0} elements in the List<Example>.", listX->Count); DisplayGenericParameters(finished); } /* This code example produces the following output: Type 'Sample' is generic: False Type 'Sample' is generic: True There are 2 elements in the List<Example>. Listing 2 type parameters for type 'Sample[TFirst,TSecond]'. Type parameter TFirst: ReferenceTypeConstraint DefaultConstructorConstraint Type parameter TSecond: Interface constraint: IExampleA Interface constraint: IExampleB Base type constraint: ExampleBase */

System.Reflection.MemberInfo
System.Type
System.Reflection.Emit.GenericTypeParameterBuilder


Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


GenericTypeParameterBuilder プロパティ

名前 | 説明 | |
---|---|---|
![]() | Assembly | オーバーライドされます。 現在の型パラメータが属するジェネリック型の定義を格納する動的アセンブリを表す Assembly オブジェクトを取得します。 |
![]() | AssemblyQualifiedName | オーバーライドされます。 常に null 参照 (Visual Basic では Nothing) を取得します。 |
![]() | Attributes | Type に関連付けられている属性を取得します。 ( Type から継承されます。) |
![]() | BaseType | オーバーライドされます。 現在のジェネリック型パラメータの基本型の制約を取得します。 |
![]() | ContainsGenericParameters | オーバーライドされます。 常に false を取得します。 |
![]() | DeclaringMethod | オーバーライドされます。 現在の GenericTypeParameterBuilder がジェネリック メソッドの型パラメータを表している場合に、宣言するメソッドを表す MethodInfo を取得します。 |
![]() | DeclaringType | オーバーライドされます。 ジェネリック型パラメータが属するジェネリック型の定義、またはジェネリック メソッドの定義を取得します。 |
![]() | DefaultBinder | 既定のバインダへの参照を取得します。このバインダは、InvokeMember によって呼び出される適切なメンバを選択するための内部規則を実装します。 ( Type から継承されます。) |
![]() | FullName | オーバーライドされます。 常に null 参照 (Visual Basic では Nothing) を取得します。 |
![]() | GenericParameterAttributes | 現在のジェネリック型パラメータの共変性および特殊な制約を説明する GenericParameterAttributes フラグの組み合わせを取得します。 ( Type から継承されます。) |
![]() | GenericParameterPosition | オーバーライドされます。 パラメータを宣言したジェネリック型またはジェネリック メソッドの型パラメータ リスト内の型パラメータの位置を取得します。 |
![]() | GUID | オーバーライドされます。 不完全なジェネリック型パラメータではサポートされていません。 |
![]() | HasElementType | 現在の Type が別の型を包含または参照しているかどうか、つまり現在の Type が配列、ポインタ、または参照渡しかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsAbstract | Type が抽象型で、オーバーライドする必要があるかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsAnsiClass | Type に、文字列書式属性として AnsiClass が選択されているかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsArray | Type が配列かどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsAutoClass | Type に、文字列書式属性として AutoClass が選択されているかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsAutoLayout | Type に、クラスのレイアウト属性として AutoLayout が選択されているかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsByRef | Type が参照渡しかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsClass | Type がクラスであり、値型やインターフェイスでないかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsCOMObject | Type が COM オブジェクトかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsContextful | Type をコンテキスト内で管理できるかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsEnum | 現在の Type が列挙体であるどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsExplicitLayout | Type に、クラスのレイアウト属性として ExplicitLayout が選択されているかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsGenericParameter | オーバーライドされます。 常に true を取得します。 |
![]() | IsGenericType | オーバーライドされます。 常に false を返します。 |
![]() | IsGenericTypeDefinition | オーバーライドされます。 常に false を取得します。 |
![]() | IsImport | Type が ComImportAttribute 属性を持っているかどうかを示す (つまり、COM タイプ ライブラリからインポートされたかどうかを示す) 値を取得します。 ( Type から継承されます。) |
![]() | IsInterface | Type がインターフェイスであり、クラスや値型でないかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsLayoutSequential | Type に、クラスのレイアウト属性として SequentialLayout が選択されているかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsMarshalByRef | Type が参照渡しでマーシャリングされるかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsNested | 現在の Type オブジェクトが、別の型の定義内に入れ子になっている定義で定義された型を表しているかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsNestedAssembly | Type が入れ子になっていて、それ自体が属するアセンブリ内でだけ参照可能かどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsNestedFamANDAssem | Type が入れ子になっていて、それ自体が属するファミリとアセンブリの両方に属しているクラスだけから参照可能かどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsNestedFamily | Type が入れ子になっていて、それ自体が属するファミリ内でだけ参照可能かどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsNestedFamORAssem | Type が入れ子になっていて、それ自体が属するファミリまたはアセンブリのいずれかに属しているクラスだけから参照可能かどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsNestedPrivate | Type が入れ子になっていて、プライベートとして宣言されているかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsNestedPublic | クラスが入れ子になっていて、パブリックとして宣言されているかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsNotPublic | Type がパブリックとして宣言されていないかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsPointer | Type がポインタかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsPrimitive | Type がプリミティブ型の 1 つかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsPublic | Type がパブリックとして宣言されているかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsSealed | Type が sealed として宣言されているかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsSerializable | Type をシリアル化できるかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsSpecialName | Type の名前が特別な処理を必要とするかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsUnicodeClass | Type に、文字列書式属性として UnicodeClass が選択されているかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsValueType | Type が値型かどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | IsVisible | Type にアセンブリの外側のコードからアクセスできるかどうかを示す値を取得します。 ( Type から継承されます。) |
![]() | MemberType | このメンバが型であるか、または入れ子にされた型であるかを示す MemberTypes 値を取得します。 ( Type から継承されます。) |
![]() | MetadataToken | メタデータ要素を識別する値を取得します。 ( MemberInfo から継承されます。) |
![]() | Module | オーバーライドされます。 ジェネリック型パラメータを格納する動的モジュールを取得します。 |
![]() | Name | オーバーライドされます。 ジェネリック型パラメータの名前を取得します。 |
![]() | Namespace | オーバーライドされます。 常に null 参照 (Visual Basic では Nothing) を取得します。 |
![]() | ReflectedType | オーバーライドされます。 GenericTypeParameterBuilder を取得するために使用した Type オブジェクトを取得します。 |
![]() | StructLayoutAttribute | 現在の型のレイアウトを説明する StructLayoutAttribute を取得します。 ( Type から継承されます。) |
![]() | TypeHandle | オーバーライドされます。 不完全なジェネリック型パラメータではサポートされていません。 |
![]() | TypeInitializer | Type のクラス初期化子を取得します。 ( Type から継承されます。) |
![]() | UnderlyingSystemType | オーバーライドされます。 不完全なジェネリック型パラメータには有効ではありません。 |

GenericTypeParameterBuilder メソッド


GenericTypeParameterBuilder メンバ
動的に定義されたジェネリック型およびジェネリック メソッドのジェネリック型パラメータを定義および作成します。このクラスは継承できません。
GenericTypeParameterBuilder データ型で公開されるメンバを以下の表に示します。



- GenericTypeParameterBuilderのページへのリンク