• C# 动态创建类型 TypeBuilder


    using System.Reflection;
    using System.Reflection.Emit;


        /// <summary> /// 获取动态类型对象 /// </summary> /// <returns></returns> public static Type DynamicClass(Dictionary<string, Type> keyValues) { //程序集名 AssemblyName assemblyName = new AssemblyName("DynamicAssembly"); //程序集 AssemblyBuilder dyAssembly = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndCollect); //模块 ModuleBuilder dyModule = dyAssembly.DefineDynamicModule("DynamicModule"); // TypeBuilder dyClass = dyModule.DefineType("MyDyClass", TypeAttributes.Public | TypeAttributes.Serializable | TypeAttributes.Class | TypeAttributes.AutoClass); foreach (var item in keyValues) { //字段 var fb = dyClass.DefineField(item.Key, item.Value, FieldAttributes.Public); //get方法 MethodBuilder mbNumberGetAccessor = dyClass.DefineMethod("get_" + item.Key, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, item.Value, Type.EmptyTypes); ILGenerator numberGetIL = mbNumberGetAccessor.GetILGenerator(); numberGetIL.Emit(OpCodes.Ldarg_0); numberGetIL.Emit(OpCodes.Ldfld, fb); numberGetIL.Emit(OpCodes.Ret); //set方法 MethodBuilder mbNumberSetAccessor = dyClass.DefineMethod("set_" + item.Key, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, null, new Type[] { item.Value }); ILGenerator numberSetIL = mbNumberSetAccessor.GetILGenerator(); numberSetIL.Emit(OpCodes.Ldarg_0); numberSetIL.Emit(OpCodes.Ldarg_1); numberSetIL.Emit(OpCodes.Stfld, fb); numberSetIL.Emit(OpCodes.Ret); //属性 PropertyBuilder pbNumber = dyClass.DefineProperty(item.Key, PropertyAttributes.HasDefault, item.Value, null); //绑定get,set方法 pbNumber.SetGetMethod(mbNumberGetAccessor); pbNumber.SetSetMethod(mbNumberSetAccessor); } //创建类型信息 return dyClass.CreateTypeInfo(); }

    动态创建类型,输入Dictionary内容为属性名和属性类型

    再.Net Core 3.1 下编写

    参考:https://docs.microsoft.com/zh-cn/dotnet/api/system.reflection.emit.typebuilder?view=net-5.0

  • 相关阅读:
    从统计学statistics的观点看概率分布
    JavaScript中getBoundingClientRect()方法详解
    insertRule()与addRule()创建规则
    Canvas 数学、物理、动画学习笔记一
    【超级干货】手机移动端WEB资源整合:转载
    JavaScript性能优化技巧之函数节流
    @font-face的用法
    Modernizr——为HTML5和CSS3而生!
    url、href、src 详解
    认识cookie与session的区别与应用
  • 原文地址:https://www.cnblogs.com/xianyv/p/14577669.html
Copyright © 2020-2023  润新知