Сегодня обнаружил интересную вещь. Я попытался определить тип динамически, используя 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());
}
Но, к сожалению, в определяемом типе есть два метода с одинаковым именем «Метод» («t» — экземпляр динамически определяемого типа):
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()}
Итак, мой вопрос: как добавить новый метод, который скрывает реализацию базового класса, что эквивалентно использованию ключевого слова С# «новый» при определении нового метода, например:
public class Test2 : Test
{
new public void Method()
{
}
}
virtual
методы. - person Henk Holterman   schedule 18.08.2014override
. - person Henk Holterman   schedule 18.08.2014