Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用TypeBuilder调用泛型基方法_C#_Generics_Reflection.emit_Typebuilder - Fatal编程技术网

C# 如何使用TypeBuilder调用泛型基方法

C# 如何使用TypeBuilder调用泛型基方法,c#,generics,reflection.emit,typebuilder,C#,Generics,Reflection.emit,Typebuilder,我有以下类:(仅供参考:我不能编辑基类) 类型的创建成功。 但是,当我创建DynamicClass的实例,然后调用Convert方法时,会出现以下异常: System.Reflection.TargetInvocationException:调用的目标已引发异常。 ---->System.InvalidProgrameException:公共语言运行库检测到无效程序。 有人能帮我解决这个问题吗?Call说明将返回值推到堆栈上,这样您就可以直接调用Ret var convertMethodILGe

我有以下类:(仅供参考:我不能编辑基类)

类型的创建成功。 但是,当我创建DynamicClass的实例,然后调用Convert方法时,会出现以下异常:

System.Reflection.TargetInvocationException:调用的目标已引发异常。 ---->System.InvalidProgrameException:公共语言运行库检测到无效程序。


有人能帮我解决这个问题吗?

Call
说明将返回值推到堆栈上,这样您就可以直接调用
Ret

var convertMethodILGenerator = convertMethodBuilder.GetILGenerator();
convertMethodILGenerator.Emit(OpCodes.Ldarg_0);
convertMethodILGenerator.Emit(OpCodes.Ldarg_1);
convertMethodILGenerator.Emit(OpCodes.Call, baseConvertMethodInstance);
convertMethodILGenerator.Emit(OpCodes.Ret);
public class DynamicClass : BaseClass
{
    public string Convert(int value)
    {
        return base.Convert<int, string>(value);
    }
}
private MethodBuilder BuildConvertMethod(TypeBuilder typeBuilder)
{
    var baseConvertMethod = typeof(BaseClass).GetMethod("Convert", BindingFlags.NonPublic | BindingFlags.CreateInstance | BindingFlags.Instance);
    var baseConvertMethodInstance = baseConvertMethod.MakeGenericMethod(typeof(int), typeof(string));

    var convertMethodBuilder = typeBuilder.DefineMethod("Convert", MethodAttributes.Public, typeof(string), new[] { typeof(int) });

    var convertMethodILGenerator = convertMethodBuilder.GetILGenerator();
    convertMethodILGenerator.Emit(OpCodes.Nop);
    convertMethodILGenerator.Emit(OpCodes.Ldarg_0);
    convertMethodILGenerator.Emit(OpCodes.Ldarg_1);
    convertMethodILGenerator.Emit(OpCodes.Call, baseConvertMethodInstance);
    convertMethodILGenerator.Emit(OpCodes.Ldloc_0);
    convertMethodILGenerator.Emit(OpCodes.Ret);

    return convertMethodBuilder;
}
var convertMethodILGenerator = convertMethodBuilder.GetILGenerator();
convertMethodILGenerator.Emit(OpCodes.Ldarg_0);
convertMethodILGenerator.Emit(OpCodes.Ldarg_1);
convertMethodILGenerator.Emit(OpCodes.Call, baseConvertMethodInstance);
convertMethodILGenerator.Emit(OpCodes.Ret);