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



  • 相关阅读:
    大规模分布式存储系统笔记一二章 概述与单机存储系统
    Apache Avro总结
    可汗学院公开课统计学笔记 第11到16集 样本 总体 方差 标准差 诸方差公式
    可汗学院公开课统计学笔记 第1到10集 均值 中位数 众数 极差 统计图
    Mock、Powermock使用汇总
    如何解决NoSuchMethodError
    2019年我看手机之华为篇
    活着
    log4j使用指北
    关于Eclipse导入maven项目报空指针异常
  • 原文地址:https://www.cnblogs.com/magic_evan/p/2207579.html
Copyright © 2011-2022 走看看