• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    ASP.NET中实现根据匿名类、datatable、sql生成实体类

    在开发中可能会遇到这几种情况:

    1、EF或LINQ查询出来的匿名对象在其它地方调用不方便,又懒的手动建实体类

    2、通过datatable反射实体需要先建一个类 ,头痛

    3、通过SQL语句返回的实体也需要先建一个类 ,头痛

    4、如果通过代码生成器要写模版,需要安装或者不想生成一堆不用的类 
     
    为了解决上面的不便之处,我封装了一个实体生成类,可以扔到程序里面任意调用

    封装类:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.Data.SqlClient;
    using System.Text.RegularExpressions;
     
    namespace SyntacticSugar
    {
      /// summary>
      /// ** 描述:实体生成类
      /// ** 创始时间:2015-4-17
      /// ** 修改时间:-
      /// ** 作者:sunkaixuan
      /// ** qq:610262374 欢迎交流,共同提高 ,命名语法等写的不好的地方欢迎大家的给出宝贵建议
      /// /summary>
      public class ClassGenerating
      {
        /// summary>
        /// 根据匿名类获取实体类的字符串
        /// /summary>
        /// param name="entity">匿名对象/param>
        /// param name="className">生成的类名/param>
        /// returns>/returns>
        public static string DynamicToClass(object entity, string className)
        {
          StringBuilder reval = new StringBuilder();
          StringBuilder propertiesValue = new StringBuilder();
          var propertiesObj = entity.GetType().GetProperties();
          string replaceGuid = Guid.NewGuid().ToString();
          string nullable = string.Empty;
          foreach (var r in propertiesObj)
          {
     
            var type = r.PropertyType;
            if (type.IsGenericType  type.GetGenericTypeDefinition() == typeof(Nullable>))
            {
              type = type.GetGenericArguments()[0];
              nullable = "?";
            }
            if (!type.Namespace.Contains("System.Collections.Generic"))
            {
              propertiesValue.AppendLine();
              string typeName = ChangeType(type);
              propertiesValue.AppendFormat("public {0}{3} {1} {2}", typeName, r.Name, "{get;set;}", nullable);
              propertiesValue.AppendLine();
            }
          }
     
          reval.AppendFormat(@"
             public class {0}{{
                {1}
             }}
          ", className, propertiesValue);
     
     
          return reval.ToString();
        }
     
     
        /// summary>
        /// 根据DataTable获取实体类的字符串
        /// /summary>
        /// param name="sql">/param>
        /// param name="className">/param>
        /// returns>/returns>
        public static string DataTableToClass(DataTable dt, string className)
        {
          StringBuilder reval = new StringBuilder();
          StringBuilder propertiesValue = new StringBuilder();
          string replaceGuid = Guid.NewGuid().ToString();
          foreach (DataColumn r in dt.Columns)
          {
            propertiesValue.AppendLine();
            string typeName = ChangeType(r.DataType);
            propertiesValue.AppendFormat("public {0} {1} {2}", typeName, r.ColumnName, "{get;set;}");
            propertiesValue.AppendLine();
          }
          reval.AppendFormat(@"
             public class {0}{{
                {1}
             }}
          ", className, propertiesValue);
     
     
          return reval.ToString();
        }
     
        /// summary>
        /// 根据SQL语句获取实体类的字符串
        /// /summary>
        /// param name="sql">SQL语句/param>
        /// param name="className">生成的类名/param>
        /// param name="server">服务名/param>
        /// param name="database">数据库名称/param>
        /// param name="uid">账号/param>
        /// param name="pwd">密码/param>
        /// returns>/returns>
        public static string SqlToClass(string sql, string className, string server, string database, string uid, string pwd)
        {
          using (SqlConnection conn = new SqlConnection(string.Format("server={0};uid={2};pwd={3};database={1}", server, database, uid, pwd)))
          {
            SqlCommand command = new SqlCommand();
            command.Connection = conn;
            command.CommandText = sql;
            DataTable dt = new DataTable();
            SqlDataAdapter sad = new SqlDataAdapter(command);
            sad.Fill(dt);
            var reval = DataTableToClass(dt, className);
            return reval;
          }
        }
        /// summary>
        /// 根据SQL语句获取实体类的字符串
        /// /summary>
        /// param name="sql">SQL语句/param>
        /// param name="className">生成的类名/param>
        /// param name="connName">webconfig的connectionStrings name/param>
        /// returns>/returns>
        public static string SqlToClass(string sql, string className, string connName)
        {
          string connstr = System.Configuration.ConfigurationManager.ConnectionStrings[connName].ToString();
          if (connstr.Contains("metadata"))//ef
            connstr = Regex.Match(connstr, @"connection string\=""(.+)""").Groups[1].Value;
          using (SqlConnection conn = new SqlConnection(connstr))
          {
            SqlCommand command = new SqlCommand();
            command.Connection = conn;
            command.CommandText = sql;
            DataTable dt = new DataTable();
            SqlDataAdapter sad = new SqlDataAdapter(command);
            sad.Fill(dt);
            var reval = DataTableToClass(dt, className);
            return reval;
          }
        }
        /// summary>
        /// 匹配类型
        /// /summary>
        /// param name="type">/param>
        /// returns>/returns>
        private static string ChangeType(Type type)
        {
          string typeName = type.Name;
          switch (typeName)
          {
            case "Int32": typeName = "int"; break;
            case "String": typeName = "string"; break;
          }
          return typeName;
        }
      }
    }
    


    调用如下:

    //通过匿名对象生成实体类
          var dynamicObj = new { id = 1, name = "小名", entity = new enityt1() };
          //注意:只能是单个实体不能传入 ListT> ,集合需要  List[0]
          string classCode = ClassGenerating.DynamicToClass(dynamicObj, "classDynamic");
    
    
          //通过datatable生成实体类
          DataTable dt = new DataTable();
          dt.Columns.Add("Id", typeof(int));
          dt.Columns.Add("Name");
    
          classCode = ClassGenerating.DataTableToClass(dt, "classTatabale");
    
    
          //通过sql语句生成实体类
          classCode = ClassGenerating.SqlToClass("select * from note", "Note", "127.0.0.1", "MyWork", "sa", "sasa"); 
          classCode = ClassGenerating.SqlToClass("select * from dbo.AccessoriesDetail", "AccessoriesDetail", "NFDEntities");//通过 config connstring名称
    
    

    然后在调试状态把你需要的结果CTRL+C 然后去新建一个类CTRL+V


    您可能感兴趣的文章:
    • Kotlin基础教程之伴生对象,getter,setter,内部,局部,匿名类,可变参数
    • java 中使用匿名类直接new接口详解及实例代码
    • Java中匿名类的两种实现方式
    • java 内部类(匿名类,匿名对象,静态内部类)详解及实例
    • PHP7匿名类用法分析
    • 使用 Lambda 取代 Android 中的匿名类
    • 全面了解Java中的内部类和匿名类
    • 深入讲解C#编程中嵌套类型和匿名类型的定义与使用
    • 详细解读C++编程中的匿名类类型和位域
    • Java通过匿名类来实现回调函数实例总结
    上一篇:ASP.NET中实现Form表单字段值自动填充到操作模型中
    下一篇:ASP.NET中实现把form表单元素转为实体对象或集合
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    ASP.NET中实现根据匿名类、datatable、sql生成实体类 ASP.NET,中,实现,根据,匿名,