下載app免費領取會員
假設有一個ITest接口,它有兩個實現分別是TestClass1,和TestClass2,這時候如果需要一個TestClass4類但是現有程序里又沒有這個類,就可以在運行時生成一個這樣的類
這個應該是可以用來實現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();
}
}
本文版權歸腿腿教學網及原創作者所有,未經授權,謝絕轉載。
上一篇:二次開發教程:Revit開發BuildingEnvelopeAnalyzer
推薦專題