MethodBuilder.MakeGenericMethod(Type[]) 方法

定義

回傳一個由當前通用方法定義並使用指定的通用型別參數構建的通用方法。

public:
 override System::Reflection::MethodInfo ^ MakeGenericMethod(... cli::array <Type ^> ^ typeArguments);
public override System.Reflection.MethodInfo MakeGenericMethod(params Type[] typeArguments);
override this.MakeGenericMethod : Type[] -> System.Reflection.MethodInfo
Public Overrides Function MakeGenericMethod (ParamArray typeArguments As Type()) As MethodInfo

參數

typeArguments
Type[]

一組 Type 物件陣列,代表通用方法的型別參數。

傳回

A MethodInfo 代表由當前通用方法定義並使用指定的泛型型參數構建的泛型方法。

範例

以下程式碼範例將從不完整的通用方法定義在不完整型別中建立一個建構方法。

範例中建立一個具有單一型別的瞬態組件與模組,加入一個方法 M,並透過該 DefineGenericParameters 方法加入型別參數 T 使該方法成為通用。 型別參數同時用作方法參數的型別,同時也是其回傳型別。 一般方法定義未被賦予主體,且包圍型別未完成。 接著使用MakeGenericMethod方法來產生構造方法M<String>(在Visual Basic中M(Of String))。 範例程式碼沒有輸出,因為方法回傳MakeGenericMethodMethodInfo子類別不允許對其參數進行反射。

Note

關於另一個使用 MakeGenericMethod的程式碼範例,請參見 DefineGenericParametersMakeGenericMethod 也廣泛用於發出使用泛型型別的程式碼。 詳見 :定義具有反射輻射的通用方法

using System;
using System.Reflection;
using System.Reflection.Emit;

class Example
{
    public static void Main()
    {
        // Define a transient dynamic assembly (only to run, not
        // to save) with one module and a type "Test".
        //
        AssemblyName aName = new AssemblyName("MyDynamic");
        AssemblyBuilder ab =
            AppDomain.CurrentDomain.DefineDynamicAssembly(
                aName,
                AssemblyBuilderAccess.Run);
        ModuleBuilder mb = ab.DefineDynamicModule(aName.Name);
        TypeBuilder tb = mb.DefineType("Test");

        // Add a public static method "M" to Test, and make it a
        // generic method with one type parameter named "T").
        //
        MethodBuilder meb = tb.DefineMethod("M",
            MethodAttributes.Public | MethodAttributes.Static);
        GenericTypeParameterBuilder[] typeParams =
            meb.DefineGenericParameters(new string[] { "T" });

        // Give the method one parameter, of type T, and a
        // return type of T.
        meb.SetParameters(typeParams);
        meb.SetReturnType(typeParams[0]);

        // Create a MethodInfo for M<string>, which can be used in
        // emitted code. This is possible even though the method
        // does not yet have a body, and the enclosing type is not
        // created.
        MethodInfo mi = meb.MakeGenericMethod(typeof(string));
        // Note that this is actually a subclass of MethodInfo,
        // which has rather limited capabilities -- for
        // example, you cannot reflect on its parameters.
    }
}
Imports System.Reflection
Imports System.Reflection.Emit

Class Example

    Public Shared Sub Main()
    
        ' Define a transient dynamic assembly (only to run, not
        ' to save) with one module and a type "Test".
        ' 
        Dim aName As AssemblyName = New AssemblyName("MyDynamic")
        Dim ab As AssemblyBuilder = _
            AppDomain.CurrentDomain.DefineDynamicAssembly( _
                aName, _
                AssemblyBuilderAccess.Run)
        Dim mb As ModuleBuilder = ab.DefineDynamicModule(aName.Name)
        Dim tb As TypeBuilder = mb.DefineType("Test")

        ' Add a Public Shared method "M" to Test, and make it a
        ' generic method with one type parameter named "T").
        '
        Dim meb As MethodBuilder = tb.DefineMethod("M", _
            MethodAttributes.Public Or MethodAttributes.Static)
        Dim typeParams() As GenericTypeParameterBuilder = _
            meb.DefineGenericParameters(New String() { "T" })

        ' Give the method one parameter, of type T, and a 
        ' return type of T.
        meb.SetParameters(typeParams)
        meb.SetReturnType(typeParams(0))

        ' Create a MethodInfo for M(Of String), which can be used 
        ' in emitted code. This is possible even though the method
        ' does not yet have a body, and the enclosing type is not
        ' created.
        Dim mi As MethodInfo = _
            meb.MakeGenericMethod(GetType(String))
        ' Note that this is actually a subclass of MethodInfo, 
        ' which has rather limited capabilities -- for
        ' example, you cannot reflect on its parameters.
    End Sub
End Class

備註

當你要輸出動態程式碼時,可能需要在包圍型別尚未完成之前,先對由一般方法定義 MethodBuilder所構成的方法呼叫。 你可以用 這個MakeGenericMethod方法為這樣的建構方法建立 aMethodInfo,並在發出的呼叫中使用 。MethodInfo

適用於

另請參閱