该动态编译可以生成一个DTO类
1.创建一个控制台项目
2.新建一个c#类,一个Dto类
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Reflection;
using System.Collections.Generic;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
IList<ParameterDto> parameters = new List<ParameterDto>();
parameters.Add(new ParameterDto(1, "强制条件", "#MandatoryConditions", 4));
parameters.Add(new ParameterDto(2, "请假天数", "#LeaveDays", 1));
parameters.Add(new ParameterDto(3, "请假原因", "#LeaveReason", 2));
parameters.Add(new ParameterDto(4, "返校日期", "#RetuenDate", 3));
parameters.Add(new ParameterDto(5, "审核签字", "#SignName", 2));
int result = CodeDomParameter(parameters);
}
//CodeDOM 动态编译实体类
//CodeDOM 动态编译实体类
public static int CodeDomParameter(IList<WParameterDto> parameters)
{
int result = 0;
//准备一个代码编译器单元
CodeCompileUnit unit = new CodeCompileUnit();
//准备必要的命名空间(这个是指要生成的类的空间)
CodeNamespace sampleNamespace = new CodeNamespace("WFlow.DTOs");
//导入必要的命名空间
sampleNamespace.Imports.Add(new CodeNamespaceImport("System"));
//准备要生成的类的定义
CodeTypeDeclaration Customerclass = new CodeTypeDeclaration("InputParameterDto");
//指定这是一个Class
Customerclass.IsClass = true;
Customerclass.TypeAttributes = TypeAttributes.Public | TypeAttributes.Sealed;
//把这个类放在这个命名空间下
sampleNamespace.Types.Add(Customerclass);
//把该命名空间加入到编译器单元的命名空间集合中
unit.Namespaces.Add(sampleNamespace);
//这是输出文件
string outputFile = "D:\\Vs\\Workflow\\Workflow\\DTOs\\InputParameterDto.cs";
//参数数据类型,1 - 数值型 2 - 字符串类型 3 - 时间日期 4 - 布尔型
CodeMemberField field = null;
foreach (WParameterDto parameter in parameters)
{
//添加字段
string paremeterCode ="_"+ parameter.parameterCode.Substring(1);
//赋值的字段
string parameterCodeP = parameter.parameterCode.Substring(1);
switch (parameter.parameterType)
{
case 1:
field = new CodeMemberField(typeof(int), paremeterCode);
break;
case 2:
field = new CodeMemberField(typeof(string), paremeterCode);
break;
case 3:
field = new CodeMemberField(typeof(string), paremeterCode);
break;
case 4:
field = new CodeMemberField(typeof(bool), paremeterCode);
break;
default:
break;
}
field.Attributes = MemberAttributes.Private;
field.Comments.Add(new CodeCommentStatement(parameter.parameterName));
Customerclass.Members.Add(field);
//添加属性
CodeMemberProperty property = new CodeMemberProperty();
property.Attributes = MemberAttributes.Public | MemberAttributes.Final;
property.Name = parameterCodeP;
property.HasGet = true;
property.HasSet = true;
property.Type = null;
//参数数据类型,1 - 数值型 2 - 字符串类型 3 - 时间日期 4 - 布尔型
switch (parameter.parameterType)
{
case 1:
property.Type = new CodeTypeReference(typeof(int));
break;
case 2:
property.Type = new CodeTypeReference(typeof(string));
break;
case 3:
property.Type = new CodeTypeReference(typeof(string));
break;
case 4:
property.Type = new CodeTypeReference(typeof(bool));
break;
default:
break;
}
property.Comments.Add(new CodeCommentStatement(parameter.parameterName));
property.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), paremeterCode)));
property.SetStatements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), paremeterCode), new CodePropertySetValueReferenceExpression()));
Customerclass.Members.Add(property);
}
//添加方法(使用CodeMemberMethod)--此处略
//添加构造器(使用CodeConstructor) --此处略
//添加程序入口点(使用CodeEntryPointMethod) --此处略
//添加事件(使用CodeMemberEvent) --此处略
//添加特征(使用 CodeAttributeDeclaration)
Customerclass.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(SerializableAttribute))));
//生成代码
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
CodeGeneratorOptions options = new CodeGeneratorOptions();
options.BracingStyle = "C";
options.BlankLinesBetweenMembers = true;
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(outputFile))
{
//if (File.Exists(@outputFile)) {
// File.Delete(@outputFile);
//}
provider.GenerateCodeFromCompileUnit(unit, sw, options);
result = 1;
}
//string sourceFile = @"InputParameterDto.cs";
//string destinationFile = @"../../DTOs/InputParameterDto.cs";
//FileInfo file = new FileInfo(sourceFile);
//if (file.Exists)
//{
// // true is overwrite
// file.CopyTo(destinationFile, true);
//}
return result;
}
}
}
namespace ConsoleApplication1
{
internal class ParameterDto
{
private int parameterId;
private string parameterName;
private string parameterCode;
private int parameterType;
public int ParameterId
{
get
{
return parameterId;
}
set
{
parameterId = value;
}
}
public string ParameterName
{
get
{
return parameterName;
}
set
{
parameterName = value;
}
}
public string ParameterCode
{
get
{
return parameterCode;
}
set
{
parameterCode = value;
}
}
public int ParameterType
{
get
{
return parameterType;
}
set
{
parameterType = value;
}
}
public ParameterDto(int parameterId, string parameterName, string parameterCode, int parameterType)
{
this.ParameterId = parameterId;
this.ParameterName = parameterName;
this.ParameterCode = parameterCode;
this.ParameterType = parameterType;
}
}
}
3.运行控制台项目
运行后得到一个类,该类的位置默认位于该项目文件夹中
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace Workflow.DTOs
{
using System;
public class ParameterDto
{
// 强制条件
private bool MandatoryConditions;
// 请假天数
private int LeaveDays;
// 请假原因
private string LeaveReason;
// 返校日期
private string RetuenDate;
// 审核签字
private string SignName;
public bool MandatoryConditions
{
get
{
return this.MandatoryConditions;
}
set
{
this.MandatoryConditions = value;
}
}
public int LeaveDays
{
get
{
return this.LeaveDays;
}
set
{
this.LeaveDays = value;
}
}
public string LeaveReason
{
get
{
return this.LeaveReason;
}
set
{
this.LeaveReason = value;
}
}
public string RetuenDate
{
get
{
return this.RetuenDate;
}
set
{
this.RetuenDate = value;
}
}
public string SignName
{
get
{
return this.SignName;
}
set
{
this.SignName = value;
}
}
}
}
4.生成dll
打开项目,选择属性,ctrl+s保存设置。
2.点击生成,选择重新生成解决方案
3.dll文件位于