1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | class Program { static void Main( string [] args) { var obj = EmitHelper.ImplInterface<IPerson>(); obj.say(); obj.sayHi(); } } public interface IPerson { void say(); void sayHi(); } public class EmitHelper { public static T ImplInterface<T>() { string name = "ImplInterface" ; AssemblyName asmName = new AssemblyName(name); Type classType = typeof (T); var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndCollect); var modelBuider = assemblyBuilder.DefineDynamicModule(name + ".dll" ); var typeBuilder = modelBuider.DefineType( "impl_" + classType.Name); typeBuilder.AddInterfaceImplementation( typeof (T)); var methods = classType.GetMembers(); foreach ( var method in methods) { var methodBuilder = typeBuilder.DefineMethod(method.Name, MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual | MethodAttributes.Final, null , Type.EmptyTypes); typeBuilder.DefineMethodOverride(methodBuilder, typeof (T).GetMethod(method.Name)); //TODO:以下是方法体的生成,还得再分析与修改 ILGenerator il = methodBuilder.GetILGenerator(); il.Emit(OpCodes.Ldstr, "接口:" + method.Name); il.Emit(OpCodes.Call, typeof (Console).GetMethod( "WriteLine" , new Type[] { typeof ( string ) })); il.Emit(OpCodes.Ret); } Type objType = typeBuilder.CreateType(); object obj = Activator.CreateInstance(objType); return (T)obj; } } |
讓眾人的薪枝構起這團熱情的火焰
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步