在 .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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录