下載app免費(fèi)領(lǐng)取會(huì)員
網(wǎng)友投稿
更多假設(shè)有一個(gè)ITest接口,它有兩個(gè)實(shí)現(xiàn)分別是TestClass1,和TestClass2,這時(shí)候如果需要一個(gè)TestClass4類但是現(xiàn)有程序里又沒(méi)有這個(gè)類,就可以在運(yùn)行時(shí)生成一個(gè)這樣的類
這個(gè)應(yīng)該是可以用來(lái)實(shí)現(xiàn)AOP,
public interface ITest
{
void Run();
}
public class TestClass1 : ITest
{
public void Run()
{
Console.WriteLine("TestClass1");
}
}
public class TestClass2 : ITest
{
public void Run()
{
Console.WriteLine("TestClass2");
}
}
public class TestClass4 : ITest
{
public void Run()
{
ITest t1 = new TestClass1();
t1.Run();
ITest t2 = new TestClass2();
t2.Run();
}
}
class Program
{
static void Main(string[] args)
{
const string ASSEMBLY_NAME = "MyDynamicAssembly";
AppDomain appDomain = AppDomain.CurrentDomain;
AssemblyName assemblyName = new AssemblyName(ASSEMBLY_NAME);
AssemblyBuilder assemblyBuilder = appDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndCollect);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, assemblyName.Name + ".dll");
TypeBuilder typeBuilder = moduleBuilder.DefineType("TestClass3", TypeAttributes.Public | TypeAttributes.Class);
typeBuilder.AddInterfaceImplementation(typeof(ITest));
MethodBuilder methodBuilder = typeBuilder.DefineMethod("Run", MethodAttributes.Public | MethodAttributes.Virtual);
ILGenerator iLGenerator = methodBuilder.GetILGenerator();
iLGenerator.DeclareLocal(typeof(ITest));
iLGenerator.Emit(OpCodes.Nop);
iLGenerator.Emit(OpCodes.Newobj, typeof(TestClass1).GetConstructors().First());
iLGenerator.Emit(OpCodes.Stloc_0);
iLGenerator.Emit(OpCodes.Ldloc_0);
iLGenerator.Emit(OpCodes.Callvirt, typeof(ITest).GetMethod("Run"));
iLGenerator.Emit(OpCodes.Nop);
iLGenerator.Emit(OpCodes.Nop);
iLGenerator.Emit(OpCodes.Newobj, typeof(TestClass2).GetConstructors().First());
iLGenerator.Emit(OpCodes.Stloc_0);
iLGenerator.Emit(OpCodes.Ldloc_0);
iLGenerator.Emit(OpCodes.Callvirt, typeof(ITest).GetMethod("Run"));
iLGenerator.Emit(OpCodes.Nop);
iLGenerator.Emit(OpCodes.Ret);
Type type = typeBuilder.CreateType();
ITest t = (ITest)Activator.CreateInstance(type);
t.Run();
Console.ReadLine();
}
}
本文版權(quán)歸腿腿教學(xué)網(wǎng)及原創(chuàng)作者所有,未經(jīng)授權(quán),謝絕轉(zhuǎn)載。
上一篇:二次開(kāi)發(fā)教程:Revit開(kāi)發(fā)BuildingEnvelopeAnalyzer
下一篇:二次開(kāi)發(fā)教程:C# 初探UI Automation
推薦專題