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 };
    }
    }



  • 相关阅读:
    Vue 2.x windows环境下安装
    VSCODE官网下载缓慢或下载失败 解决办法
    angular cli 降级
    Win10 VS2019 设置 以管理员身份运行
    XSHELL 连接 阿里云ECS实例
    Chrome浏览器跨域设置
    DBeaver 执行 mysql 多条语句报错
    DBeaver 连接MySql 8.0 报错 Public Key Retrieval is not allowed
    DBeaver 连接MySql 8.0报错 Unable to load authentication plugin 'caching_sha2_password'
    Linux系统分区
  • 原文地址:https://www.cnblogs.com/magic_evan/p/2207579.html
Copyright © 2011-2022 走看看