gpt4 book ai didi

c# - 动态覆盖c#中的抽象方法

转载 作者:行者123 更新时间:2023-11-30 19:13:45 25 4
gpt4 key购买 nike

我有以下不能更改的抽象类。

public abstract class AbstractThing {
public String GetDescription() {
return "This is " + GetName();
}
public abstract String GetName();
}

现在我想像这样实现一些新的动态类型。

AssemblyName assemblyName = new AssemblyName();
assemblyName.Name = "My.TempAssembly";
AssemblyBuilder assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("DynamicThings");
TypeBuilder typeBuilder = moduleBuilder.DefineType(someName + "_Thing",
TypeAttributes.Public |
TypeAttributes.Class,
typeof(AbstractThing));
MethodBuilder methodBuilder = typeBuilder.DefineMethod("GetName",
MethodAttributes.Public |
MethodAttributes.ReuseSlot |
MethodAttributes.Virtual |
MethodAttributes.HideBySig,
null,
Type.EmptyTypes);

ILGenerator msil = methodBuilder.GetILGenerator();

msil.EmitWriteLine(selectionList);
msil.Emit(OpCodes.Ret);

但是当我尝试通过

实例化时
typeBuilder.CreateType();

我收到一个异常,指出没有 GetName 的实现。我在这里做错了什么吗?我看不出问题。

此外,按名称实例化此类的限制是什么?例如,如果我尝试通过“My.TempAssembly.x_Thing”进行实例化,它是否可以在没有生成类型的情况下进行实例化?

最佳答案

动态创建的函数的返回类型错误。它应该是 string 而不是 void:

typeBuilder.DefineMethod("GetName",   
MethodAttributes.Public |
MethodAttributes.ReuseSlot |
MethodAttributes.Virtual |
MethodAttributes.HideBySig,
typeof(string),
Type.EmptyTypes);

关于c# - 动态覆盖c#中的抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2826141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com