zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ORM 实现数据库表的增删改查
    数据库表设计(一对多,多对多)
    Razor模板引擎
    文件的上传(表单上传和ajax文件异步上传)
    生成验证码封装(新版)
    MD5加密
    反射的一些基本用法
    数据的增删改查(三层)<!--待补充-->
    linux文件的硬连接和软连接
    linux磁盘用满的两种情况
  • 原文地址:https://www.cnblogs.com/xianyv/p/14577669.html
Copyright © 2011-2022 走看看