今天我发现了一件有趣的事情。我尝试使用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()
{
}
}
答案 0 :(得分:1)
您可以看到两种方法,因为您使用了type.GetMethods()而没有bindingflags。尝试使用bindingflags.declaredonly。
您只能看到一种方法。 这正是你想要的。
新关键字是一个c#的东西,以避免错误地隐藏基本方法。
它会强制您使用覆盖或新建以避免警告。
如果要覆盖基本方法,请在TypeBuilder上使用方法DefineMethodOverride。