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

时间:2010-05-13 10:50:49

标签: c#

我有以下抽象类,无法更改。

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”实例化它是否可以在没有生成Type的情况下进行实例化?

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

我会改用Func。它不需要反射来动态改变方法。

public class AbstractThing {
   public String GetDescription() {
      return "This is " + GetName();
   }
   public Func<String> GetName { get; set; }
}

var thing = new AbstractThing();
thing.GetName = () => "Some Name"; // Or any other method
thing.GetDescription() == "This is Some Name";