C# dynamic 动态生成
时间: 2023-07-16 17:13:01 浏览: 125
C#动态对象(dynamic)详解(实现方法和属性的动态)
在 C# 中,使用 `dynamic` 关键字可以实现动态编程的功能。通过使用 `dynamic`,可以将变量的类型推迟到运行时进行确定,从而实现一些灵活的编程。
动态生成代码可以通过使用 `System.Reflection.Emit` 命名空间提供的类来实现。这些类允许你在运行时动态地创建和编译代码,并将其加载到当前应用程序域中。
以下是一个使用 `dynamic` 和 `System.Reflection.Emit` 来动态生成一个简单的类的示例:
```csharp
using System;
using System.Reflection;
using System.Reflection.Emit;
class Program
{
static void Main(string[] args)
{
// 创建一个动态程序集和模块
AssemblyName assemblyName = new AssemblyName("DynamicAssembly");
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(
assemblyName, AssemblyBuilderAccess.RunAndSave);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("DynamicModule", "DynamicModule.dll");
// 定义一个名为 MyDynamicClass 的类
TypeBuilder typeBuilder = moduleBuilder.DefineType("MyDynamicClass", TypeAttributes.Public);
// 添加一个名为 MyDynamicMethod 的方法
MethodBuilder methodBuilder = typeBuilder.DefineMethod(
"MyDynamicMethod", MethodAttributes.Public | MethodAttributes.Static,
typeof(void), new Type[] { typeof(string) });
// 向方法中添加代码
ILGenerator il = methodBuilder.GetILGenerator();
il.Emit(OpCodes.Ldstr, "Hello, World!");
il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
il.Emit(OpCodes.Ret);
// 完成类的定义
Type myDynamicClass = typeBuilder.CreateType();
// 创建一个实例并调用 MyDynamicMethod 方法
dynamic instance = Activator.CreateInstance(myDynamicClass);
instance.MyDynamicMethod("test");
// 保存程序集
assemblyBuilder.Save("DynamicModule.dll");
}
}
```
以上代码会动态创建一个名为 `MyDynamicClass` 的类,并在其中添加一个名为 `MyDynamicMethod` 的方法,在该方法中输出 "Hello, World!"。最后,代码会将程序集保存到当前目录下的 `DynamicModule.dll` 文件中。
阅读全文