精华内容
下载资源
问答
  • 但是旧应用系统优化,项目更新,就几个人开发加维护,接口层越多,bll层越来越厚,人来人往留下一堆代码,怎么管理呢?我现在方法是:看,仔细看,再仔细看,改,仔细改,再仔细改。一般出问题了,结合数据库,基本...

      做这个功能目的是对旧项目代码分析管理,代码规划。

      如果重头开发,统一一个框架小框架搞,人、时间到位都不是问题。但是旧应用系统优化,项目更新,就几个人开发加维护,接口层越多,bll层越来越厚,人来人往留下一堆代码,怎么管理呢?我现在方法是:看,仔细看,再仔细看,改,仔细改,再仔细改。一般出问题了,结合数据库,基本可以解决。如果重新搞,还得熟悉原来的代码,再搬进新的项目,费时费力。有没有一种方式最好不用写代码,做个配置界面,将业务SQL和逻辑用工作流的方式以字符串(JSon、描述对象模型(这玩意我自定义了一个对象来描述各类关系,下次讲))的形式先保存起来,形成一个运行时编程环境,配置完善后通过字符串生成自己喜欢的框架呢?找了好久没找到,就自己写个。

      要解决不要写代码,那么所有层的Model(实体、DTO、其他业务模型)肯定要用运行时模型,传输统一用字符串,哪一层都能接受。这样一想,思路就有了。这里的所有模型只做三个事情:实例化、输入和输出。输入为object或者json,输出为object或者dynamic也可以是JSon。代码做了简单的封装。直接上代码:

    动态生成帮助类:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Reflection;
      5 using System.Reflection.Emit;
      6 using System.Text;
      7 using System.Threading.Tasks;
      8 
      9 namespace MagicModel
     10 {
     11     public abstract  class EmitHelper
     12     {
     13       
     14         private static AssemblyName assmblyname;
     15         private static string DllName;
     16         private static AssemblyBuilder assemblybuilder;
     17         private static ModuleBuilder modulebuilder;
     18         private static TypeBuilder typebuilder;
     19         private static Type _dymaticType;
     20 
     21         public static Type DymaticType
     22         {
     23             get
     24             {
     25                 return _dymaticType;
     26             }
     27 
     28             //set
     29             //{
     30             //    dymaticType = value;
     31             //}
     32         }
     33 
     34         public static void Create(string dllname)
     35         {
     36             DllName = dllname;
     37             assmblyname = new AssemblyName(DllName);
     38             ///2程序集生成器
     39             assemblybuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assmblyname, AssemblyBuilderAccess.RunAndSave);
     40 
     41             // For a single-module assembly, the module name is usually
     42             // the assembly name plus an extension.
     43             ////3动态创建模块
     44             modulebuilder = assemblybuilder.DefineDynamicModule(assmblyname.Name, assmblyname.Name + ".dll");
     45         }
     46         public static void CreateClass(string NsClassName)
     47         {
     48             typebuilder = modulebuilder.DefineType(NsClassName, TypeAttributes.Public);
     49         }
     50         public static void CreateMember(string MemberName, Type memberType)
     51         {
     52             FieldBuilder fbNumber = typebuilder.DefineField(
     53               "m_" + MemberName,
     54              memberType,
     55               FieldAttributes.Private);
     56 
     57 
     58             PropertyBuilder pbNumber = typebuilder.DefineProperty(
     59                 MemberName,
     60                 System.Reflection.PropertyAttributes.HasDefault,
     61                 memberType,
     62                 null);
     63 
     64 
     65             MethodAttributes getSetAttr = MethodAttributes.Public |
     66                 MethodAttributes.SpecialName | MethodAttributes.HideBySig;
     67 
     68 
     69             MethodBuilder mbNumberGetAccessor = typebuilder.DefineMethod(
     70                 "get_" + MemberName,
     71                 getSetAttr,
     72                 memberType,
     73                 Type.EmptyTypes);
     74 
     75             ILGenerator numberGetIL = mbNumberGetAccessor.GetILGenerator();
     76 
     77             numberGetIL.Emit(OpCodes.Ldarg_0);
     78             numberGetIL.Emit(OpCodes.Ldfld, fbNumber);
     79             numberGetIL.Emit(OpCodes.Ret);
     80 
     81             // Define the "set" accessor method for Number, which has no return
     82             // type and takes one argument of type int (Int32).
     83             MethodBuilder mbNumberSetAccessor = typebuilder.DefineMethod(
     84                 "set_" + MemberName,
     85                 getSetAttr,
     86                 null,
     87                 new Type[] { memberType });
     88 
     89             ILGenerator numberSetIL = mbNumberSetAccessor.GetILGenerator();
     90             // Load the instance and then the numeric argument, then store the
     91             // argument in the field.
     92             numberSetIL.Emit(OpCodes.Ldarg_0);
     93             numberSetIL.Emit(OpCodes.Ldarg_1);
     94             numberSetIL.Emit(OpCodes.Stfld, fbNumber);
     95             numberSetIL.Emit(OpCodes.Ret);
     96 
     97             // Last, map the "get" and "set" accessor methods to the 
     98             // PropertyBuilder. The property is now complete. 
     99             pbNumber.SetGetMethod(mbNumberGetAccessor);
    100             pbNumber.SetSetMethod(mbNumberSetAccessor);
    101             ///最重要的是你最后要创建类型
    102 
    103         }
    104         public static Type SaveClass()
    105         {
    106             _dymaticType = typebuilder.CreateType();
    107             return DymaticType;
    108         }
    109         public static void Save()
    110         {
    111             assemblybuilder.Save(assmblyname.Name + ".dll");
    112         }
    113         ///// <summary>
    114         ///// 创建一个实体类并保存生成类型
    115         ///// </summary>
    116         ///// <param name="NsClassName"></param>
    117         ///// <param name="propertys"></param>
    118         //public void Execute(string NsClassName, Dictionary<string, Type> propertys)
    119         //{
    120           
    121         //    CreateClass(NsClassName);
    122         //    foreach (var item in propertys)
    123         //    {
    124         //        CreateMember(item.Key, item.Value);
    125         //    }
    126         //    SaveClass();
    127         //    Save();
    128         //}
    129 
    130         //public void Execute(List<M_DefineClass> _classes) {
    131         
    132         //    foreach (M_DefineClass _class in _classes)
    133         //    {
    134         //        CreateClass(_class.NsClassName);
    135         //        foreach (var prop in _class.Props)
    136         //        {
    137         //            CreateMember(prop.MemberName, prop.MemberType);
    138         //        }
    139         //        SaveClass();
    140         //    }
    141           
    142         //}
    143 
    144         //public void Test(string dllname, string NsClassName, string MemberName, Type memberType)
    145         //{
    146         //    //1设置程序集名称
    147         //    assmblyname = new AssemblyName(dllname);
    148         //    ///2程序集生成器
    149         //    assemblybuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assmblyname, AssemblyBuilderAccess.RunAndSave);
    150         //    3动态创建模块
    151         //    modulebuilder = assemblybuilder.DefineDynamicModule(assmblyname.Name, assmblyname.Name + ".dll");
    152         //    ///4.创建类
    153         //    typebuilder = modulebuilder.DefineType(NsClassName, TypeAttributes.Public);
    154         //    ///5.创建私有字段
    155         //    FieldBuilder fbNumber = typebuilder.DefineField(
    156         //     "m_" + MemberName,
    157         //     memberType,
    158         //     FieldAttributes.Private);
    159 
    160         //    ///6.创建共有属性
    161         //    PropertyBuilder pbNumber = typebuilder.DefineProperty(
    162         //        MemberName,
    163         //        System.Reflection.PropertyAttributes.HasDefault,
    164         //        memberType,
    165         //        null);
    166 
    167 
    168         //    MethodAttributes getSetAttr = MethodAttributes.Public |
    169         //        MethodAttributes.SpecialName | MethodAttributes.HideBySig;
    170 
    171 
    172         //    MethodBuilder mbNumberGetAccessor = typebuilder.DefineMethod(
    173         //        "get_" + MemberName,
    174         //        getSetAttr,
    175         //        memberType,
    176         //        Type.EmptyTypes);
    177 
    178         //    ILGenerator numberGetIL = mbNumberGetAccessor.GetILGenerator();
    179 
    180         //    numberGetIL.Emit(OpCodes.Ldarg_0);
    181         //    numberGetIL.Emit(OpCodes.Ldfld, fbNumber);
    182         //    numberGetIL.Emit(OpCodes.Ret);
    183 
    184         //    // Define the "set" accessor method for Number, which has no return
    185         //    // type and takes one argument of type int (Int32).
    186         //    MethodBuilder mbNumberSetAccessor = typebuilder.DefineMethod(
    187         //        "set_" + MemberName,
    188         //        getSetAttr,
    189         //        null,
    190         //        new Type[] { typeof(int) });
    191 
    192         //    ILGenerator numberSetIL = mbNumberSetAccessor.GetILGenerator();
    193         //    // Load the instance and then the numeric argument, then store the
    194         //    // argument in the field.
    195         //    numberSetIL.Emit(OpCodes.Ldarg_0);
    196         //    numberSetIL.Emit(OpCodes.Ldarg_1);
    197         //    numberSetIL.Emit(OpCodes.Stfld, fbNumber);
    198         //    numberSetIL.Emit(OpCodes.Ret);
    199 
    200         //    // Last, map the "get" and "set" accessor methods to the 
    201         //    // PropertyBuilder. The property is now complete. 
    202         //    pbNumber.SetGetMethod(mbNumberGetAccessor);
    203         //    pbNumber.SetSetMethod(mbNumberSetAccessor);
    204 
    205         //    ///最重要的是你最后要创建类型
    206         //    Type t = typebuilder.CreateType();
    207         //    assemblybuilder.Save(assmblyname.Name + ".dll");
    208 
    209         //}
    210 
    211 
    212     }
    213 }
    View Code

    初始动态模型:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MagicModel.BLL
    {
        public class DynamicInitBLL
        {
            static M_Base _m_base;
    
            /// <summary>
            /// 3.设置和获取,生成结果放入Base里
            /// </summary>
            public static M_Base M_Base
            {
                get
                {
                    return _m_base;
                }
    
                set
                {
                    _m_base = value;
                }
            }
            /// <summary>
            /// 初始化,实现步骤为三步
            /// </summary>
            /// <param name="m_base"></param>
            public DynamicInitBLL(M_Base m_base) {
                _m_base = m_base;
                EmitHelper.Create(_m_base._AssamblyName);
              
            }
            /// <summary>
            /// 1创建单个Class
            /// </summary>
            /// <param name="_class"></param>
            public void Exequte(M_DefineClass _class)
            {
    
                    EmitHelper.CreateClass(_class.NsClassName);
                    foreach (var prop in _class.Props)
                    {
                    EmitHelper.CreateMember(prop.MemberName, prop.MemberType);
                    }
                _m_base.DymaticType.Add(new M_DymaticType() {TypeName=_class.NsClassName,DType= EmitHelper.SaveClass() });
            }
            /// <summary>
            /// 1创建多个Class
            /// </summary>
            /// <param name="_classes"></param>
            public void Exequte(List<M_DefineClass> _classes) {
                foreach (var item in _classes)
                {
                    Exequte(item);
                }
            }
            /// <summary>
            /// 2保存
            /// </summary>
            public void SaveAssembly() {
                EmitHelper.Save();
            }
    
    
        }
    }
    View Code

    模型赋值:

    using MagicModel;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Reflection;
    
    namespace MagicModel.BLL
    {
        public class DynamicEmulateBLL
        {
            M_Base _m_base;
            public DynamicEmulateBLL(M_Base _mbase) {
                _m_base = _mbase;
            }
            public object ObjectEmulate(string nsclassName,object data) {
                Type _classType = _m_base.DymaticType.Where(a => a.TypeName == nsclassName).FirstOrDefault().DType;
                var obj = Activator.CreateInstance(_classType);
    
                foreach (PropertyInfo pi in _classType.GetProperties())
                {
                    if (data.GetType().GetProperty(pi.Name)!=null)
                    {
                        Console.WriteLine("有相同的值");
                        pi.SetValue(obj, data.GetType().GetProperty(pi.Name).GetValue(data));
                    } 
                }
                return obj;
            }
    
            public object JsonEmulate(string nsclassName, string jsonstring) {
                Type _classType = _m_base.DymaticType.Where(a => a.TypeName == nsclassName).FirstOrDefault().DType;
               return    Newtonsoft.Json.JsonConvert.DeserializeObject(jsonstring, _classType);
            }
    
        }
    }
    View Code

    交互模型:

    using System;
    using System.Collections.Generic;
    
    namespace MagicModel
    {
        public class M_Base {
            public string _AssamblyName { get; set; }
            public List<M_DymaticType> DymaticType { get; set; } = new List<M_DymaticType>();
        }
        public class M_DymaticType
        {
            public string TypeName { get; set; }
            public Type DType { get; set; }
        }
        public class M_DefineClass
        {
            public string NsClassName { get;  set; }
            public IEnumerable<M_ClassMember> Props { get;  set; }
        }
        public class M_ClassMember 
        {
            public string MemberName { get;  set; }
            public Type MemberType { get;  set; }
        }
    
    }
    View Code

    下面来测试下效果,先定义10个类:

    打开vs里面的cmd开发人员命令提示”,输入ildasm,然后把生成的dll拖进去,有了。

    赋值检验:

    有效果了

      到了这一步,动态模型生成完成,它的调用位置不仅限于运行时代码,也可以在其他环境中使用了。

      疑问:

      1.运行时环境下处理引用问题是个麻烦事,所以干脆静态一个AssemblyName,项目间交叉引用该怎么解决?

           2.我开始用Assembly去取dll,发现两个问题。1,交叉引用出问题。2,赋值取值出问题。

           3.这个RunAndSave参数直接加载进来了,所以就在这上面static保存在内存等待以后调用,有没有更好的方法调用?或者说我生成的dll文件想什么时候用什么时候用,在哪里用都由我决定。

     

          以上资料全参考msdn。

         模型层可以存库,做生成对比,做db对比等等,后面再优化!

     

     

     

     

        

    转载于:https://www.cnblogs.com/coolbader/p/7959650.html

    展开全文
  • 但是旧应用系统优化,项目更新,就几个人开发加维护,接口层越多,bll层越来越厚,人来人往留下一堆代码,怎么管理呢?我现在方法是:看,仔细看,再仔细看,改,仔细改,再仔细改。一般出问题了,结合数据库,基本...

      做这个功能目的是对旧项目代码分析管理,代码规划。

      如果重头开发,统一一个框架小框架搞,人、时间到位都不是问题。但是旧应用系统优化,项目更新,就几个人开发加维护,接口层越多,bll层越来越厚,人来人往留下一堆代码,怎么管理呢?我现在方法是:看,仔细看,再仔细看,改,仔细改,再仔细改。一般出问题了,结合数据库,基本可以解决。如果重新搞,还得熟悉原来的代码,再搬进新的项目,费时费力。有没有一种方式最好不用写代码,做个配置界面,将业务SQL和逻辑用工作流的方式以字符串(JSon、描述对象模型(这玩意我自定义了一个对象来描述各类关系,下次讲))的形式先保存起来,形成一个运行时编程环境,配置完善后通过字符串生成自己喜欢的框架呢?找了好久没找到,就自己写个。

      要解决不要写代码,那么所有层的Model(实体、DTO、其他业务模型)肯定要用运行时模型,传输统一用字符串,哪一层都能接受。这样一想,思路就有了。这里的所有模型只做三个事情:实例化、输入和输出。输入为object或者json,输出为。代码做了简单的封装。直接上代码:

    动态生成帮助类:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Reflection;
      5 using System.Reflection.Emit;
      6 using System.Text;
      7 using System.Threading.Tasks;
      8 
      9 namespace MagicModel
     10 {
     11     public abstract  class EmitHelper
     12     {
     13       
     14         private static AssemblyName assmblyname;
     15         private static string DllName;
     16         private static AssemblyBuilder assemblybuilder;
     17         private static ModuleBuilder modulebuilder;
     18         private static TypeBuilder typebuilder;
     19         private static Type _dymaticType;
     20 
     21         public static Type DymaticType
     22         {
     23             get
     24             {
     25                 return _dymaticType;
     26             }
     27 
     28             //set
     29             //{
     30             //    dymaticType = value;
     31             //}
     32         }
     33 
     34         public static void Create(string dllname)
     35         {
     36             DllName = dllname;
     37             assmblyname = new AssemblyName(DllName);
     38             ///2程序集生成器
     39             assemblybuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assmblyname, AssemblyBuilderAccess.RunAndSave);
     40 
     41             // For a single-module assembly, the module name is usually
     42             // the assembly name plus an extension.
     43             ////3动态创建模块
     44             modulebuilder = assemblybuilder.DefineDynamicModule(assmblyname.Name, assmblyname.Name + ".dll");
     45         }
     46         public static void CreateClass(string NsClassName)
     47         {
     48             typebuilder = modulebuilder.DefineType(NsClassName, TypeAttributes.Public);
     49         }
     50         public static void CreateMember(string MemberName, Type memberType)
     51         {
     52             FieldBuilder fbNumber = typebuilder.DefineField(
     53               "m_" + MemberName,
     54              memberType,
     55               FieldAttributes.Private);
     56 
     57 
     58             PropertyBuilder pbNumber = typebuilder.DefineProperty(
     59                 MemberName,
     60                 System.Reflection.PropertyAttributes.HasDefault,
     61                 memberType,
     62                 null);
     63 
     64 
     65             MethodAttributes getSetAttr = MethodAttributes.Public |
     66                 MethodAttributes.SpecialName | MethodAttributes.HideBySig;
     67 
     68 
     69             MethodBuilder mbNumberGetAccessor = typebuilder.DefineMethod(
     70                 "get_" + MemberName,
     71                 getSetAttr,
     72                 memberType,
     73                 Type.EmptyTypes);
     74 
     75             ILGenerator numberGetIL = mbNumberGetAccessor.GetILGenerator();
     76 
     77             numberGetIL.Emit(OpCodes.Ldarg_0);
     78             numberGetIL.Emit(OpCodes.Ldfld, fbNumber);
     79             numberGetIL.Emit(OpCodes.Ret);
     80 
     81             // Define the "set" accessor method for Number, which has no return
     82             // type and takes one argument of type int (Int32).
     83             MethodBuilder mbNumberSetAccessor = typebuilder.DefineMethod(
     84                 "set_" + MemberName,
     85                 getSetAttr,
     86                 null,
     87                 new Type[] { memberType });
     88 
     89             ILGenerator numberSetIL = mbNumberSetAccessor.GetILGenerator();
     90             // Load the instance and then the numeric argument, then store the
     91             // argument in the field.
     92             numberSetIL.Emit(OpCodes.Ldarg_0);
     93             numberSetIL.Emit(OpCodes.Ldarg_1);
     94             numberSetIL.Emit(OpCodes.Stfld, fbNumber);
     95             numberSetIL.Emit(OpCodes.Ret);
     96 
     97             // Last, map the "get" and "set" accessor methods to the 
     98             // PropertyBuilder. The property is now complete. 
     99             pbNumber.SetGetMethod(mbNumberGetAccessor);
    100             pbNumber.SetSetMethod(mbNumberSetAccessor);
    101             ///最重要的是你最后要创建类型
    102 
    103         }
    104         public static Type SaveClass()
    105         {
    106             _dymaticType = typebuilder.CreateType();
    107             return DymaticType;
    108         }
    109         public static void Save()
    110         {
    111             assemblybuilder.Save(assmblyname.Name + ".dll");
    112         }
    113         ///// <summary>
    114         ///// 创建一个实体类并保存生成类型
    115         ///// </summary>
    116         ///// <param name="NsClassName"></param>
    117         ///// <param name="propertys"></param>
    118         //public void Execute(string NsClassName, Dictionary<string, Type> propertys)
    119         //{
    120           
    121         //    CreateClass(NsClassName);
    122         //    foreach (var item in propertys)
    123         //    {
    124         //        CreateMember(item.Key, item.Value);
    125         //    }
    126         //    SaveClass();
    127         //    Save();
    128         //}
    129 
    130         //public void Execute(List<M_DefineClass> _classes) {
    131         
    132         //    foreach (M_DefineClass _class in _classes)
    133         //    {
    134         //        CreateClass(_class.NsClassName);
    135         //        foreach (var prop in _class.Props)
    136         //        {
    137         //            CreateMember(prop.MemberName, prop.MemberType);
    138         //        }
    139         //        SaveClass();
    140         //    }
    141           
    142         //}
    143 
    144         //public void Test(string dllname, string NsClassName, string MemberName, Type memberType)
    145         //{
    146         //    //1设置程序集名称
    147         //    assmblyname = new AssemblyName(dllname);
    148         //    ///2程序集生成器
    149         //    assemblybuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assmblyname, AssemblyBuilderAccess.RunAndSave);
    150         //    3动态创建模块
    151         //    modulebuilder = assemblybuilder.DefineDynamicModule(assmblyname.Name, assmblyname.Name + ".dll");
    152         //    ///4.创建类
    153         //    typebuilder = modulebuilder.DefineType(NsClassName, TypeAttributes.Public);
    154         //    ///5.创建私有字段
    155         //    FieldBuilder fbNumber = typebuilder.DefineField(
    156         //     "m_" + MemberName,
    157         //     memberType,
    158         //     FieldAttributes.Private);
    159 
    160         //    ///6.创建共有属性
    161         //    PropertyBuilder pbNumber = typebuilder.DefineProperty(
    162         //        MemberName,
    163         //        System.Reflection.PropertyAttributes.HasDefault,
    164         //        memberType,
    165         //        null);
    166 
    167 
    168         //    MethodAttributes getSetAttr = MethodAttributes.Public |
    169         //        MethodAttributes.SpecialName | MethodAttributes.HideBySig;
    170 
    171 
    172         //    MethodBuilder mbNumberGetAccessor = typebuilder.DefineMethod(
    173         //        "get_" + MemberName,
    174         //        getSetAttr,
    175         //        memberType,
    176         //        Type.EmptyTypes);
    177 
    178         //    ILGenerator numberGetIL = mbNumberGetAccessor.GetILGenerator();
    179 
    180         //    numberGetIL.Emit(OpCodes.Ldarg_0);
    181         //    numberGetIL.Emit(OpCodes.Ldfld, fbNumber);
    182         //    numberGetIL.Emit(OpCodes.Ret);
    183 
    184         //    // Define the "set" accessor method for Number, which has no return
    185         //    // type and takes one argument of type int (Int32).
    186         //    MethodBuilder mbNumberSetAccessor = typebuilder.DefineMethod(
    187         //        "set_" + MemberName,
    188         //        getSetAttr,
    189         //        null,
    190         //        new Type[] { typeof(int) });
    191 
    192         //    ILGenerator numberSetIL = mbNumberSetAccessor.GetILGenerator();
    193         //    // Load the instance and then the numeric argument, then store the
    194         //    // argument in the field.
    195         //    numberSetIL.Emit(OpCodes.Ldarg_0);
    196         //    numberSetIL.Emit(OpCodes.Ldarg_1);
    197         //    numberSetIL.Emit(OpCodes.Stfld, fbNumber);
    198         //    numberSetIL.Emit(OpCodes.Ret);
    199 
    200         //    // Last, map the "get" and "set" accessor methods to the 
    201         //    // PropertyBuilder. The property is now complete. 
    202         //    pbNumber.SetGetMethod(mbNumberGetAccessor);
    203         //    pbNumber.SetSetMethod(mbNumberSetAccessor);
    204 
    205         //    ///最重要的是你最后要创建类型
    206         //    Type t = typebuilder.CreateType();
    207         //    assemblybuilder.Save(assmblyname.Name + ".dll");
    208 
    209         //}
    210 
    211 
    212     }
    213 }
    View Code

    初始动态模型:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MagicModel.BLL
    {
        public class DynamicInitBLL
        {
            static M_Base _m_base;
    
            /// <summary>
            /// 3.设置和获取,生成结果放入Base里
            /// </summary>
            public static M_Base M_Base
            {
                get
                {
                    return _m_base;
                }
    
                set
                {
                    _m_base = value;
                }
            }
            /// <summary>
            /// 初始化,实现步骤为三步
            /// </summary>
            /// <param name="m_base"></param>
            public DynamicInitBLL(M_Base m_base) {
                _m_base = m_base;
                EmitHelper.Create(_m_base._AssamblyName);
              
            }
            /// <summary>
            /// 1创建单个Class
            /// </summary>
            /// <param name="_class"></param>
            public void Exequte(M_DefineClass _class)
            {
    
                    EmitHelper.CreateClass(_class.NsClassName);
                    foreach (var prop in _class.Props)
                    {
                    EmitHelper.CreateMember(prop.MemberName, prop.MemberType);
                    }
                _m_base.DymaticType.Add(new M_DymaticType() {TypeName=_class.NsClassName,DType= EmitHelper.SaveClass() });
            }
            /// <summary>
            /// 1创建多个Class
            /// </summary>
            /// <param name="_classes"></param>
            public void Exequte(List<M_DefineClass> _classes) {
                foreach (var item in _classes)
                {
                    Exequte(item);
                }
            }
            /// <summary>
            /// 2保存
            /// </summary>
            public void SaveAssembly() {
                EmitHelper.Save();
            }
    
    
        }
    }
    View Code

    模型赋值:

    using MagicModel;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Reflection;
    
    namespace MagicModel.BLL
    {
        public class DynamicEmulateBLL
        {
            M_Base _m_base;
            public DynamicEmulateBLL(M_Base _mbase) {
                _m_base = _mbase;
            }
            public object ObjectEmulate(string nsclassName,object data) {
                Type _classType = _m_base.DymaticType.Where(a => a.TypeName == nsclassName).FirstOrDefault().DType;
                var obj = Activator.CreateInstance(_classType);
    
                foreach (PropertyInfo pi in _classType.GetProperties())
                {
                    if (data.GetType().GetProperty(pi.Name)!=null)
                    {
                        Console.WriteLine("有相同的值");
                        pi.SetValue(obj, data.GetType().GetProperty(pi.Name).GetValue(data));
                    } 
                }
                return obj;
            }
    
            public object JsonEmulate(string nsclassName, string jsonstring) {
                Type _classType = _m_base.DymaticType.Where(a => a.TypeName == nsclassName).FirstOrDefault().DType;
               return    Newtonsoft.Json.JsonConvert.DeserializeObject(jsonstring, _classType);
            }
    
        }
    }
    View Code

    交互模型:

    using System;
    using System.Collections.Generic;
    
    namespace MagicModel
    {
        public class M_Base {
            public string _AssamblyName { get; set; }
            public List<M_DymaticType> DymaticType { get; set; } = new List<M_DymaticType>();
        }
        public class M_DymaticType
        {
            public string TypeName { get; set; }
            public Type DType { get; set; }
        }
        public class M_DefineClass
        {
            public string NsClassName { get;  set; }
            public IEnumerable<M_ClassMember> Props { get;  set; }
        }
        public class M_ClassMember 
        {
            public string MemberName { get;  set; }
            public Type MemberType { get;  set; }
        }
    
    }
    View Code

    下面来测试下效果,先定义10个类:

    打开vs里面的cmd开发人员命令提示”,输入ildasm,然后把生成的dll拖进去,有了。

    赋值检验:

    有效果了

      到了这一步,动态模型生成完成,它的调用位置不仅限于运行时代码,也可以在其他环境中使用了。

      疑问:

      1.运行时环境下处理引用问题是个麻烦事,所以干脆静态一个AssemblyName,项目间交叉引用该怎么解决?

           2.我开始用Assembly去取dll,发现两个问题。1,交叉引用出问题。2,赋值取值出问题。

           3.这个RunAndSave参数直接加载进来了,所以就在这上面static保存在内存等待以后调用,有没有更好的方法调用?或者说我生成的dll文件想什么时候用什么时候用,在哪里用都由我决定。

     

          以上资料全参考msdn。

         模型层可以存库,做生成对比,做db对比等等,后面再优化!

     

     

     

     

        

    转载于:https://www.cnblogs.com/coolbader/p/7959630.html

    展开全文
  • 转载自:https://www.cnblogs.com/rayshaw/p/9037969.html 该作者详细展示了机器学习项目一般流程,涉及数据预处理、数据可视化、sklearn模型和参数设定、调参优化比较等。...

    转载自:https://www.cnblogs.com/rayshaw/p/9037969.html

    该作者详细展示了机器学习项目一般流程,涉及数据预处理、数据可视化、sklearn模型和参数设定、调参优化比较等。

    展开全文
  • 决策很重要:下一步该怎么搞 收集更多数据 调试超参数 调整神经网络的大小或结构 采用不同的优化算法 进行正则化 etc. 我们有可能浪费大量时间在一条错误的改进路线 正交化 简单理解: 一个任务 == 多个...

    决策很重要:下一步该怎么搞

    发现90%的准确度,想要提高,怎么做呢?

    • 收集更多数据
    • 调试超参数
    • 调整神经网络的大小或结构
    • 采用不同的优化算法
    • 进行正则化
    • etc.

    我们有可能浪费大量时间在一条错误的改进路线

    正交化

    简单理解:

    一个任务 == 多个独立子任务,当某个任务发生变化,其他不受影响!

    电视机 == 按钮1调节亮度  按钮2调节音量 按钮3调节色彩对比度   互不影响!

    对于监督学习:

    希望达到四个目标

    1. 建立的模型在训练集上表现良好;
    2. 建立的模型在验证集上表现良好;
    3. 建立的模型在测试集上表现良好;
    4. 建立的模型在实际应用中表现良好。

    解决方案

    • 对于第一条,如果模型在训练集上表现不好,可以尝试训练更大的神经网络或者换一种更好的优化算法(例如 Adam);
    • 对于第二条,如果模型在验证集上表现不好,可以进行正则化处理或者加入更多训练数据;
    • 对于第三条,如果模型在测试集上表现不好,可以尝试使用更大的验证集进行验证;
    • 对于第四条,如果模型在实际应用中表现不好,可能是因为测试集没有设置正确或者成本函数评估指标有误,需要改变测试集或成本函数。

    综述

    为这4个目标设计“按钮”,调节这些按钮,分别达到相应的目标,而不影响其他目标。参照上述解决方案。

     如何判断哪个网络更好

    例子

    A模型(没采用AI算法) == 预测全部人都是良性,结果误差0.5%

    B模型(采用了AI算法) == 预测出了大多数恶性案例,结果误差1%

    表面看是A好,但是实际B更好;A是瞎搞的,B预测出了大部分案例。

    单值评价指标(single-number evaluation metric)

    精确率 == 查准率

    召回率 == 查全率

    优化指标和满足指标

    满足指标 == 预测时间在100ms以内,否则一律淘汰

    优化指标 == 只要满足这个时间内,准确率越精准越好!

    判断标准是可以改变的

    A模型判断美女的准确率==97%,B模型判断美女的准确率==95%,但是A判断出的图片里面,很多准确,但是不符合核心价值观。那实际使用还是B更好。。。

    需要我们标注出这些图片,更改成本函数,判断出这些不符合规范的图片,使成本大幅上涨。

    还有很多例子,识别高清可以,标清的不行,等等。需要我们见招拆招,随机应变。

    AI能力与人类能力

    当机器学习能力超过人的能力水平后,它的进步速度逐渐变得缓慢,最终性能无法超过某个理论上限,这个上限被称为贝叶斯最优误差(Bayes Optimal Error)

    因为人类能力接近贝叶斯最优误差,所以当机器学习系统的表现超过人类后,就没有太多继续改善的空间了。

    人都无法识别图片了,就没办法打标签之类的了。

    利用贝叶斯误差来判断拟合度

    识别男女,自己的神经网络,训练集的误差8% 验证集的误差10%

    若人的误差是1%,说明是学习的不够,属于欠拟合,需要参照解决方案去提升。

    若人的误差是7%,说明训练集提升空间不大了,在验证集,可能发生了过拟合,需要增大训练集,正则化等。

    (在训练集上学的太过了,太适应历史的K线,不适应未来的K线)

    神经网络的误差与贝叶斯误差的差距也被叫做可避免误差

    若神经网络的误差为7%,贝叶斯误差为1%,那么可避免误差==6%。

    也就是说,这个神经网络可提升的空间只有6%,因为贝叶斯误差是最优误差,不可能被超越。

     人类的误差是多少

    我们拿专家组医生的误差率作为贝叶斯误差。

    实习医生、普通医生的误差,都可以成为人类误差。若一个产品超过了普通医生,那就已经有很强的实用性了。

    AI超越人类

    专家组的误差率是0.5%,而AI超越人类之后,训练集上表现是0.3% 测试集上表现是0.2%,我们也无法判断是过拟合还是次欠拟合了,没有对比标准了。

    提升AI系统

    提升AI系统==系统对更多的数据 拟合得更好

    展开全文
  • 超参数优化

    2019-10-23 23:43:28
    1.网格搜索 将参数依次尝试 2.随机搜索 随机选择网格内参数 ...建立目标函数的替代概率模型 怎么替代的? 找到在代理上表现最佳的超参数 怎么评估是最佳的? 将这些超参数应用于真正的目标函数 更新包含新结果...
  • 但是,当我们建立好了相关模型以后我们怎么评价我们建立模型的好坏以及优化我们建立模型呢?那本次分享的内容就是关于机器学习模型评估与超参数调优的。本次分享的内容包括:用管道简化工作流使用k折交叉验证...
  • Datawhale干货作者:李...但是,当我们建立好了相关模型以后我们怎么评价我们建立模型的好坏以及优化我们建立模型呢?那本次分享的内容就是关于机器学习模型评估与超参数调优的。本次分享的内容包括:用管道简化...
  • ↑↑↑关注后"星标"Datawhale每日干货 &每月组队学习,不错过Datawhale干货作者:李祖贤 深圳大学,...但是,当我们建立好了相关模型以后我们怎么评价我们建立模型的好坏以及优化我们建立模型呢?那本次...
  • 在物流活动中,配送成本占据整个...本文提出了应用MATLAB软件,通过建立配送优化的TSP模型,运用基于遗传算法的优化算法解决TSP问题,并有相关实例进行验证,对物流企业实现科学快捷的配送调度和路径的优化有实际意义。
  • 该小节的目标是根据上一节得到的离散误差动力学模型,在MPCD的滚动时间窗内建立并求解QP问题. 那么,我们要回答以下两个问题: 1.什么是QP问题?其标准形式的什么样的?2.怎么把MPC中的优化问题转化为求解QP问题? \begin{...
  • 建索引是我们在提高数据库查询性能、减低SQL执行时间的主要手段,但是怎么建立一个最适合的索引呢?我们来深入浅出索引分析一下 我们都知道索引的作用是提高数据查询效率。   常见索引模型:哈希表、有序数组、...
  • 此书第二章主要针对架构方面怎么实现一些具体的优化手段,4.1节主要描述的是性能测试方面的,暂时不想去关注性能测试方面的知识。主要关注一下其他地方的优化手段。 4.2 Web前端性能优化 Web前端指网站业务逻辑之前...
  • 这两天折腾了一下 isight5.0 的 crack,总算能用上 optimization 模块了。 这段时间会做些二次开发方面的尝试,先占个位置,待这一...建立简单模型的例子见: isight5.0 二次开发之 Application (2) =
  • 设计利用模型不断优化,现场人员利用模型指导施工与运维,造价人员利用模型进行造价全过程,怎么才能避免多次建模?怎么才能一模多用?国内基本上所有Bimke都使用过Revit,Revit在设计中的强大是因为其建模包容性与...
  • 总体原则1)更新的时候一定要加where条件,否则必然引起该字段的所有记录更新2)跨表更新时,set和where时,尽量减少扫描次数,从而提高优化为了方便起见,建立了以下简单模型,和构造了部分测试数据:在某个业务受理子...
  • 详解 TensorBoard

    2018-09-30 10:22:24
    什么是 TensorBoard TensorBoard 是 TensorFlow 上一个非常酷的功能,我们都知道神经网络很多时候就像是个黑盒子,里面到底是什么样...我们在建立神经网络模型解决问题时,例如想要用一个简单的 CNN 进行数字识别时...
  • 详解 TensorBoard-如何调参

    万次阅读 2017-05-12 12:46:11
    我们都知道神经网络很多时候就像是个黑盒子,里面到底是什么样,是什么样的结构,是怎么训练的,可能很难搞清楚,而 TensorBoard 的作用就是可以把复杂的神经网络训练过程给可视化,可以更好地理解,调试并优化程序...
  • 设计人员在了解理论和工具的相关知识 后,可以精确而高效地建立器件特性模型。这些知识能让工程师一次性开发出最佳设计,实现效率最大化,并可优化他们的价值主张。为操作示波器采集以找到工程师想要看到并测量的...
  • 机器学习导论-KaggleTitanic视频及教程

    千次阅读 2016-12-20 20:58:00
    建立模型怎么知道模型的好坏:评估标准 核心:优化误差函数/代价函数J(theta),目标是优化代价函数,使之达到最小 评估标准:预测正确的/总预测的数目=准确率(很少用 准确率衡量,一般都很高)  一般两个指标...
  • Hypermesh告诉你为什么桌子椅子是四个角这是个拓扑优化问题怎么在Hypermesh进行拓扑优化导入设计模型模型划分网格添加材料属性分配属性加载荷和约束建立工况、分析拓扑优化结果告诉你为何是四个角 这几天写实用...
  • 怎么才能让你建立除来的模型更好,准确率更高,适应性更广呢?这就是我们为什么来学习“机器学习”这门学科。机器学习主要研究“模型的算法”也就是“学习算法”,有了这种学习算法,我们就可以将我们模型进行不断地...
  • pytorch - 数据读取机制中的Dataloader与Dataset

    千次阅读 多人点赞 2019-10-21 14:18:27
    怎么建立一个预测模型呢?考虑上一个博客中的机器学习模型训练五大步骤;第一是数据,第二是模型,第三是损失函数,第四是优化器,第五个是迭代训练过程。 这里主要学习数据模块当中的数据读取,数据模块通常还会...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 137
精华内容 54
关键字:

怎么建立优化模型