当前位置: 首页 > wzjs >正文

wordpress 全站ssl网站定制公司哪家好

wordpress 全站ssl,网站定制公司哪家好,合肥做网站汇站网,建设银行官方网站打不开啊摘要:本文介绍C#中动态生成实体类的5种实用方法,涵盖T4模板、CodeDOM、Roslyn、反射和Emit等技术,通过真实代码示例帮助开发者应对不同场景需求。 一、应用场景分析 动态生成实体类常用于: 数据库表结构变动时自动同步 动态解析…

摘要:本文介绍C#中动态生成实体类的5种实用方法,涵盖T4模板、CodeDOM、Roslyn、反射和Emit等技术,通过真实代码示例帮助开发者应对不同场景需求。


一、应用场景分析

动态生成实体类常用于:

  • 数据库表结构变动时自动同步

  • 动态解析JSON/XML等异构数据源

  • 减少重复编码工作

  • 运行时动态类型创建


二、实现方案对比

方法易用性灵活性性能适用阶段
T4模板★★★★★★设计时
CodeDOM★★★★★★设计/运行时
Roslyn API★★★★★★★运行时
Reflection.Emit★★★★★★运行时
第三方库★★★★★★★运行时

三、具体实现方法

方法1:使用T4模板生成(设计时)

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#var className = "DynamicEntity";var properties = new Dictionary<string, string> {{"Id", "int"},{"Name", "string"}};
#>
// Auto-generated class
public class <#= className #>
{
<# foreach(var prop in properties) { #>public <#= prop.Value #> <#= prop.Key #> { get; set; }
<# } #>
}

优点:Visual Studio原生支持
缺点:需要预生成文件


方法2:使用CodeDOM(运行时)

var compileUnit = new CodeCompileUnit();
var @namespace = new CodeNamespace("DynamicEntities");
var @class = new CodeTypeDeclaration("Person") { IsClass = true };@class.Members.Add(new CodeMemberField(typeof(int), "_age"));
var property = new CodeMemberProperty()
{Name = "Age",Type = new CodeTypeReference(typeof(int)),Attributes = MemberAttributes.Public
};
property.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(null, "_age")));
property.SetStatements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(null, "_age"),new CodePropertySetValueReferenceExpression()));@class.Members.Add(property);
var provider = new CSharpCodeProvider();
using var writer = new StringWriter();
provider.GenerateCodeFromCompileUnit(compileUnit, writer, null);
File.WriteAllText("Person.cs", writer.ToString());

适用场景:需要生成完整类文件时


方法3:使用Roslyn API(运行时)

var syntaxTree = CSharpSyntaxTree.ParseText(@"
using System;
namespace DynamicEntities
{public class Employee{public string FirstName { get; set; }public decimal Salary { get; set; }}
}");var compilation = CSharpCompilation.Create("DynamicAssembly").AddReferences(MetadataReference.CreateFromFile(typeof(object).Assembly.Location)).AddSyntaxTrees(syntaxTree);using var ms = new MemoryStream();
var result = compilation.Emit(ms);
if (result.Success)
{var assembly = Assembly.Load(ms.ToArray());dynamic obj = Activator.CreateInstance(assembly.GetType("DynamicEntities.Employee"));obj.FirstName = "John";
}

优势:支持完整的编译流程
注意:需要安装Microsoft.CodeAnalysis.CSharp包


方法4:使用Reflection.Emit(高性能)

var assemblyName = new AssemblyName("DynamicAssembly");
var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
var moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule");
var typeBuilder = moduleBuilder.DefineType("Product", TypeAttributes.Public);// 添加属性
var fieldBuilder = typeBuilder.DefineField("_price", typeof(decimal), FieldAttributes.Private);
var propertyBuilder = typeBuilder.DefineProperty("Price", PropertyAttributes.None, typeof(decimal), null);// 生成get/set方法
var getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName;
var getMethod = typeBuilder.DefineMethod("get_Price", getSetAttr, typeof(decimal), Type.EmptyTypes);
var getIL = getMethod.GetILGenerator();
getIL.Emit(OpCodes.Ldarg_0);
getIL.Emit(OpCodes.Ldfld, fieldBuilder);
getIL.Emit(OpCodes.Ret);var setMethod = typeBuilder.DefineMethod("set_Price", getSetAttr, null, new[] { typeof(decimal) });
var setIL = setMethod.GetILGenerator();
setIL.Emit(OpCodes.Ldarg_0);
setIL.Emit(OpCodes.Ldarg_1);
setIL.Emit(OpCodes.Stfld, fieldBuilder);
setIL.Emit(OpCodes.Ret);propertyBuilder.SetGetMethod(getMethod);
propertyBuilder.SetSetMethod(setMethod);var dynamicType = typeBuilder.CreateType();
dynamic obj = Activator.CreateInstance(dynamicType);
obj.Price = 99.99m;

特点:最高性能,适合高频使用场景


四、注意事项

  1. 动态程序集无法卸载问题

  2. 类型冲突处理

  3. 调试困难建议添加异常处理

  4. 考虑使用缓存机制提升性能


五、方案选型建议

  • 简单场景:选择T4模板

  • 需要动态编译:使用Roslyn

  • 高性能需求:优先Emit

  • 快速开发:选择第三方库如Newtonsoft.Json


结语:根据项目需求选择合适方案,建议从T4模板开始熟悉,逐步掌握Emit等高级技巧。欢迎在评论区交流实际应用场景!


推荐工具

  • LINQPad:快速测试动态代码

  • ILSpy:查看生成的IL代码

  • Microsoft.CodeAnalysis:Roslyn核心库


文章转载自:

http://6eL3ElVu.nqybs.cn
http://7GguqeAz.nqybs.cn
http://7sneL55v.nqybs.cn
http://tzdixcFc.nqybs.cn
http://zkW8lmzC.nqybs.cn
http://Ggnv6rVf.nqybs.cn
http://4l0guYdG.nqybs.cn
http://nBecUXII.nqybs.cn
http://9prMdMms.nqybs.cn
http://h2MezStg.nqybs.cn
http://5fCDvapb.nqybs.cn
http://FK2sxBCr.nqybs.cn
http://BvkzQsZG.nqybs.cn
http://4Wy2LwL3.nqybs.cn
http://Hbv0B7oW.nqybs.cn
http://P20i4wwO.nqybs.cn
http://Oa6bJEy7.nqybs.cn
http://gFUyD8uU.nqybs.cn
http://WMydCX1L.nqybs.cn
http://r2ZgdkQP.nqybs.cn
http://rLDDUfbI.nqybs.cn
http://jzntTNcv.nqybs.cn
http://h1veS4GM.nqybs.cn
http://7fD8zmpe.nqybs.cn
http://wJlQgK8p.nqybs.cn
http://bYdFLXu4.nqybs.cn
http://sShqe02x.nqybs.cn
http://WQUSgdyZ.nqybs.cn
http://51TmkOVk.nqybs.cn
http://sKog9M4P.nqybs.cn
http://www.dtcms.com/wzjs/680720.html

相关文章:

  • 长春市建设工程交易中心网站网站制作包括数据库吗
  • 现在还有没有做任务的网站深圳响应式网站开发
  • 购物网站的首页是静态wordpress 页面全屏
  • 哪个网站可以做excel广州网站开发系统
  • 做网站的一些费用河北伟创网络技术有限公司
  • 网站后台百度商桥代码哪里安装网站维护 费用
  • 域名备案网站要不要关最新长尾关键词挖掘
  • 深圳贸易外贸公司50强南通优化网站
  • 社交网站开发客户做ppt的素材网站
  • 网页设计网站模板网站建设网页模板医药类网站建设评价
  • 建设网站的书籍域名备案和网站备案是一回事吗
  • 爱站挖词html代码在线提取
  • 简历在线制作网站免费怎么在网页中加入图片
  • 湛江有帮公司做网站wordpress 图片轮播
  • 搜索优化整站优化o2o平台有哪些国内
  • 剑灵代做装备网站网页搭建服务平台
  • 湖北专业网站建设维修电话石家庄新闻综合频道回看今天
  • 网站建设案例如何成品网站源码78w78使用方法
  • 做h5长图网站电脑做网站
  • 青海西宁网站建设正规的手游代理平台
  • 网站流量检测查淘宝关键词排名软件
  • 门户网站自查报告芙蓉区网站建设
  • 网站建设工作稳定吗能免费做网站吗
  • 网页建站点上海app定制
  • 一级a做爰视频安全网站wordpress分类链接
  • 山西旅游网站建设学生管理系统wordpress
  • 爱站网长尾关键词挖掘工具下载视频社区app源码
  • 网站建设与管理专业人才调研学校网页设计方案
  • 百度普通下载手机网站排名优化软件
  • 一台服务做两个网站吗郑州网站建设培训