c#动态创建内存模型(笔记)

支持可为Null的模型属性:

基础:值类型是继承ValueType、对象类型是继承ObjectType;因此,我们只要看基类型属于那种就可以添加:“?”

    ///<summary>
/// 动态创建内存模型
///</summary>
public class CreateDnyModel
{
///<summary>
/// Dictionary {属性名称,属性类型}
///</summary>
private Dictionary<string, Type> dicList = new Dictionary<string, Type>();
///<summary>
/// 添加命名空间
///</summary>
private List<string> namespaceList = new List<string>();
//添加引用集合
private List<string> assemblyList = new List<string>();
public void Add(string columnName, Type columnType)
{
dicList.Add(columnName, columnType);
}

public void AddNamespace(string nameSpace)
{
if (!namespaceList.Contains(nameSpace))
namespaceList.Add(nameSpace);
}
public void AddAssembly(string assembly)
{
if (!assemblyList.Contains(assembly))
assemblyList.Add(assembly);
}

public object BuilderModel()
{
CodeDomProvider cdp = new CSharpCodeProvider(); //CodeDomProvider.CreateProvider("CSharp");
CompilerParameters cp = new CompilerParameters();
foreach (string assembly in assemblyList)
{
cp.ReferencedAssemblies.Add(assembly);
}
cp.ReferencedAssemblies.Add("System.dll");
cp.GenerateExecutable = true;
cp.GenerateInMemory = true;
CompilerResults cr = cdp.CompileAssemblyFromSource(cp, BiulderCode()); //cdp.CompileAssemblyFromSource(cp, GetCSharpCode());
if (cr.Errors.Count > 0)
{
return null;
}
Assembly asm = cr.CompiledAssembly;
return asm.CreateInstance("MyDnyModel.DnyModel_Memory");
}

private string BiulderCode()
{
CodeDomProvider cdp = new CSharpCodeProvider();
CodeCompileUnit codeCompileUnit = GetCodeCompileUnit();
ICodeGenerator gen = cdp.CreateGenerator();
using (MemoryStream memoryStream = new MemoryStream())
{
using (StreamWriter stream = new StreamWriter(memoryStream))
{
IndentedTextWriter tw = new IndentedTextWriter(stream, "");
ICodeGenerator ICG = cdp.CreateGenerator();
ICG.GenerateCodeFromCompileUnit(codeCompileUnit, tw, new CodeGeneratorOptions());
}
byte[] buf = memoryStream.ToArray();
return Encoding.Default.GetString(buf);
}
}

private CodeCompileUnit GetCodeCompileUnit()
{
CodeCompileUnit CompileUnit = new CodeCompileUnit();

CodeNamespace MyDnyModel = new CodeNamespace("MyDnyModel");//创建命名空间
CompileUnit.Namespaces.Add(MyDnyModel);

foreach (string nameSpace in namespaceList)
{
MyDnyModel.Imports.Add(new CodeNamespaceImport(nameSpace));//导入框架的命名空间
}

CodeTypeDeclaration DnyModel_Memory = new CodeTypeDeclaration("DnyModel_Memory");//类型定义
DnyModel_Memory.IsClass = true;
MyDnyModel.Types.Add(DnyModel_Memory);

string Null = string.Empty;
foreach (var entry in dicList)
{
if (entry.Value.BaseType != typeof(ValueType))
Null = "";
else
Null = " ? ";
DnyModel_Memory.Members.Add(GetField(entry.Key, Null, entry.Value));
DnyModel_Memory.Members.Add(GetFieldProperty(entry.Key, Null, entry.Value));
}

CodeMemberMethod main = new CodeMemberMethod();
main.Name = "Main";
main.ReturnType = new CodeTypeReference(typeof(void));
main.Attributes = MemberAttributes.Public | MemberAttributes.Final | MemberAttributes.Static;
DnyModel_Memory.Members.Add(main);

CodeConstructor con = new CodeConstructor();//构造函数
con.Attributes = MemberAttributes.Public;
DnyModel_Memory.Members.Add(con);

return CompileUnit;
}

private CodeMemberProperty GetFieldProperty(string columnName, string Null, Type columnType)
{
CodeMemberProperty member = new CodeMemberProperty();
member.HasGet = true;
member.HasSet = true;
member.Attributes = MemberAttributes.Public | MemberAttributes.Final;
member.Name = Null + columnName;
member.Type = new CodeTypeReference(columnType);
member.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),
"_" + columnName)));
member.SetStatements.Add(
new CodeAssignStatement(
new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "_" + columnName),
new CodePropertySetValueReferenceExpression()));

return member;
}

private CodeMemberField GetField(string columnName, string Null, Type columnType)
{
return new CodeMemberField(columnType, Null + "_" + columnName) { Attributes = MemberAttributes.Private };
}
}



原文地址:https://www.cnblogs.com/magic_evan/p/2207579.html