如何覆盖签名中未覆盖的基类方法

时间:2014-08-18 09:00:05

标签: c# reflection typebuilder

今天我发现了一件有趣的事情。我尝试使用TypeBuilder动态定义类型,并尝试覆盖' (即替换)基类中定义的方法:

public class Test
{
    public void Method()
    {
        Console.WriteLine("Test from Test");
    }
}

public void Bind(string methodToReplace, Action expr)
{
    @object = Activator.CreateInstance<T>();
    Type objectType = @object.GetType();
    AssemblyBuilder asmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("Mock"), AssemblyBuilderAccess.Run);
    ModuleBuilder modBuilder = asmBuilder.DefineDynamicModule("Mock");
    TypeBuilder tB = modBuilder.DefineType(objectType.Name, TypeAttributes.Public | TypeAttributes.Class, objectType);
    var mB = tB.DefineMethod(methodToReplace, MethodAttributes.Public);
    ILGenerator ilGen = mB.GetILGenerator();
    ilGen.EmitCall(OpCodes.Call, expr.GetType().GetMethod("Invoke"), null);
    ilGen.Emit(OpCodes.Ret);
    @object = (T)Activator.CreateInstance(tB.CreateType());
}

但是,不幸的是,在定义的类型中,有两个方法具有相同的名称&#39;方法&#39;,(&#39; t&#39;是动态的一个实例定义类型):

t.GetType().GetMethods()
{System.Reflection.MethodInfo[6]}
    [0]: {Void Method()}
    [1]: {Void Method()}
    [2]: {System.String ToString()}
    [3]: {Boolean Equals(System.Object)}
    [4]: {Int32 GetHashCode()}
    [5]: {System.Type GetType()}

所以我的问题是:如何添加隐藏基类实现的新方法,相当于使用C#&#39; new&#39;定义新方法时的关键字,例如:

public class Test2 : Test
{
    new public void Method()
    {
    }
}

1 个答案:

答案 0 :(得分:1)

您可以看到两种方法,因为您使用了type.GetMethods()而没有bindingflags。尝试使用bindingflags.declaredonly。

您只能看到一种方法。 这正是你想要的。

新关键字是一个c#的东西,以避免错误地隐藏基本方法。

它会强制您使用覆盖或新建以避免警告。

如果要覆盖基本方法,请在TypeBuilder上使用方法DefineMethodOverride。