MethodBuilder不支持GetILGenerator方法

时间:2018-06-04 10:28:46

标签: c# reflection

我正在尝试通过Reflection API生成通用方法。这是我想要创建的功能:

public List<T> CreateList<T>()
{
    return new List<T>();
}

这是程序,应该使用DemoType类创建程序集,其中包含动态生成的提及的CreateList方法:

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

class GenericMethodBuilder
{
    public static void Main()
    {
        var asmName = new AssemblyName("DemoMethodBuilder1");
        var demoAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave);

        var demoModule = demoAssembly.DefineDynamicModule(asmName.Name, asmName.Name + ".dll");
        var demoType = demoModule.DefineType("DemoType", TypeAttributes.Public);

        var create_list_method = demoType.DefineMethod("CreateList", MethodAttributes.Public | MethodAttributes.Static);

        var TInput = create_list_method.DefineGenericParameters(new string[] { "TInput" })[0];
        var t_list_type = typeof(List<>).MakeGenericType(TInput);

        create_list_method.SetParameters(Type.EmptyTypes);
        create_list_method.SetReturnType(t_list_type);

        var ilgen = create_list_method.GetILGenerator();

        ilgen.Emit(OpCodes.Newobj, t_list_type.GetConstructors()[0]);
        ilgen.Emit(OpCodes.Ret);

        Type dt = demoType.CreateType();
        demoAssembly.Save(asmName.Name + ".dll");
    }
}

但在执行create_list_method.GetILGenerator()期间,我收到了NotSupportedException,并收到了消息:

  

其他信息:不支持指定的方法。

这种方法有什么问题?我检查了文档,看起来没问题。

1 个答案:

答案 0 :(得分:1)

收到的例外是:

  

[System.NotSupportedException:不支持指定的方法。]      在System.Reflection.Emit.TypeBuilderInstantiation.GetConstructors(BindingFlags bindingAttr)      在GenericMethodBuilder.Main():第26行

GetConstructor电话。

这是因为您尝试获取尚未构造的类型List<TInput>的构造函数。

可行的方法是使用静态TypeBuilder.GetConstructor - 方法的魔力来创建泛型类型构造函数的适当表示:

ilgen.Emit(OpCodes.Newobj, TypeBuilder.GetConstructor(t_list_type, typeof(List<>).GetConstructors()[0]));

TypeBuilder.GetConstructor的msdn条目提供了相当广泛的解释和示例。