.NET 6 动态添加类字段:使用反射创建可扩展类
在 .NET 6 中,可以使用 System.Reflection.Emit 命名空间中的 TypeBuilder 类来动态地创建和修改类。下面是一个示例,展示如何给一个类动态地添加字段:
using System;
using System.Reflection;
using System.Reflection.Emit;
public class MyClass
{
public int MyProperty { get; set; }
}
public class Program
{
public static void Main()
{
// 创建动态程序集
AssemblyName assemblyName = new AssemblyName("DynamicAssembly");
AssemblyBuilder assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
// 创建动态模块
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("DynamicModule");
// 创建动态类
TypeBuilder typeBuilder = moduleBuilder.DefineType("DynamicClass", TypeAttributes.Public);
// 添加字段
FieldBuilder fieldBuilder = typeBuilder.DefineField("_myField", typeof(int), FieldAttributes.Private);
// 添加属性
PropertyBuilder propertyBuilder = typeBuilder.DefineProperty("MyProperty", PropertyAttributes.HasDefault, typeof(int), null);
// 定义属性的get和set方法
MethodBuilder getMethodBuilder = typeBuilder.DefineMethod("get_MyProperty", MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, typeof(int), Type.EmptyTypes);
ILGenerator getILGenerator = getMethodBuilder.GetILGenerator();
getILGenerator.Emit(OpCodes.Ldarg_0);
getILGenerator.Emit(OpCodes.Ldfld, fieldBuilder);
getILGenerator.Emit(OpCodes.Ret);
MethodBuilder setMethodBuilder = typeBuilder.DefineMethod("set_MyProperty", MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, null, new[] { typeof(int) });
ILGenerator setILGenerator = setMethodBuilder.GetILGenerator();
setILGenerator.Emit(OpCodes.Ldarg_0);
setILGenerator.Emit(OpCodes.Ldarg_1);
setILGenerator.Emit(OpCodes.Stfld, fieldBuilder);
setILGenerator.Emit(OpCodes.Ret);
// 将get和set方法与属性关联起来
propertyBuilder.SetGetMethod(getMethodBuilder);
propertyBuilder.SetSetMethod(setMethodBuilder);
// 创建类型并实例化
Type dynamicType = typeBuilder.CreateType();
dynamicType.GetProperty("MyProperty").SetValue(Activator.CreateInstance(dynamicType), 123);
// 输出结果
MyClass obj = (MyClass)Activator.CreateInstance(dynamicType);
Console.WriteLine(obj.MyProperty); // 输出:123
}
}
在上述示例中,我们使用 TypeBuilder 类创建了一个名为 DynamicClass 的动态类,并使用 DefineField 方法在类中添加了一个名为 _myField 的私有字段。然后,我们使用 DefineProperty 方法添加了一个名为 MyProperty 的属性,并使用 DefineMethod 方法定义了属性的 get 和 set 方法。最后,我们使用 CreateType 方法创建了动态类型,并通过反射设置了属性值。
原文地址: https://www.cveoy.top/t/topic/p1bP 著作权归作者所有。请勿转载和采集!