C# dynamic 动态生成类
时间: 2023-07-16 15:13:02 浏览: 157
c# 4.0新特性详解
C# 中可以使用 `dynamic` 关键字来实现动态生成类,具体步骤如下:
1. 使用 `ExpandoObject` 类创建一个动态对象:
```csharp
dynamic obj = new ExpandoObject();
```
2. 为动态对象添加属性和方法:
```csharp
obj.MyProperty = "Hello";
obj.MyMethod = new Action(() => Console.WriteLine(obj.MyProperty));
```
3. 使用 `dynamic` 对象调用动态方法:
```csharp
obj.MyMethod(); // 输出 "Hello"
```
4. 如果需要动态生成类,可以使用 `TypeBuilder` 类:
```csharp
AssemblyName assemblyName = new AssemblyName("MyAssembly");
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(
assemblyName, AssemblyBuilderAccess.RunAndSave);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyModule");
TypeBuilder typeBuilder = moduleBuilder.DefineType(
"MyClass", TypeAttributes.Public);
typeBuilder.DefineField("myField", typeof(string), FieldAttributes.Private);
MethodBuilder methodBuilder = typeBuilder.DefineMethod(
"MyMethod", MethodAttributes.Public, null, null);
ILGenerator ilGen = methodBuilder.GetILGenerator();
ilGen.Emit(OpCodes.Ldstr, "Hello, world!");
ilGen.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new[] { typeof(string) }));
ilGen.Emit(OpCodes.Ret);
Type type = typeBuilder.CreateType();
dynamic instance = Activator.CreateInstance(type);
instance.MyMethod(); // 输出 "Hello, world!"
```
以上代码使用 `TypeBuilder` 动态生成了一个名为 `MyClass` 的类,该类包含一个私有字段 `myField` 和一个公共方法 `MyMethod`,`MyMethod` 方法输出字符串 "Hello, world!"。最后使用 `Activator.CreateInstance` 创建了该类的一个实例,并调用了 `MyMethod` 方法。
阅读全文