Вы имеете в виду с Reflection.Emit
? Если это так, вы используете TypeBuilder.DefineMethod
, с MethodAttributes.Abstract
.
Вот пример; в Bar.Method
есть abstract
; Bar2.Method
переопределяет.
AssemblyName an = new AssemblyName("Foo");
var asm = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run);
var module = asm.DefineDynamicModule("Foo");
var type = module.DefineType("Bar", TypeAttributes.Abstract | TypeAttributes.Class | TypeAttributes.AnsiClass);
var method = type.DefineMethod("Method", MethodAttributes.Abstract | MethodAttributes.Public | MethodAttributes.Virtual,
CallingConventions.HasThis, typeof(int), Type.EmptyTypes);
var final = type.CreateType();
type = module.DefineType("Bar2", TypeAttributes.Sealed | TypeAttributes.Class | TypeAttributes.AnsiClass, final);
var method2 = type.DefineMethod("Bar", MethodAttributes.Public | MethodAttributes.Virtual,
CallingConventions.HasThis, typeof(int), Type.EmptyTypes);
var il = method2.GetILGenerator();
il.Emit(OpCodes.Ldc_I4_4);
il.Emit(OpCodes.Ret);
type.DefineMethodOverride(method2, method);
var concrete = type.CreateType();
object obj = Activator.CreateInstance(concrete);
int result = (int) concrete.GetMethod("Bar").Invoke(obj, null);