动态生成实体类

转载: .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() };           //注意:只能是单个实体不能传入 List<T> ,集合需要   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

时间: 2024-11-05 19:03:15

动态生成实体类的相关文章

eclipse逆向生成实体类

(转自:http://blog.csdn.net/wangpeng047/article/details/6877720) 做项目必然要先进行数据库表设计,然后根据数据库设计建立实体类(VO),这是理所当然的,但是到公司里做项目后,让我认识到,没有说既进行完数据库设计后还要再"自己"建立一变VO.意思是,在项目设计时,要么根据需求分析建立实体类,由正向生成数据库表:要么就先进行数据库表设计,再逆向生成实体类.没有说进行完任意一方的设计后再去花时间去自己匹配建立另一方的设计. 原因是:

如何通过java反射将数据库表生成实体类?

首先有几点声明: 1.代码是在别人的基础进行改写的: 2.大家有什么改进的意见可以告诉我,也可以自己改好共享给其他人: 3.刚刚毕业,水平有限,肯定有许多不足之处: 4.希望刚刚学习java的同学能有所启发. //这个是做转换的类,里面的DB只是封装了数据库的连接,大家可以用自己的,随意 package com.tt.util.gen.entity.tool; import java.io.File;import java.io.FileWriter;import java.io.IOExcep

T4模板_根据DB生成实体类

为了减少重复劳动,可以通过T4读取数据库表结构,生成实体类,用下面的实例测试了一下 1.首先创建一个项目,并添加文本模板: 2.添加 文本模板: 3.向T4文本模板文件添加代码: <#@ template language="C#" debug="True" hostspecific="True" #> <#@ assembly name="System.Data" #> <#@ assembly

NHibernate生成实体类、xml映射文件

最近工作电脑装完win10后,之前使用的codeSmith安装不了,索性自己写一个. 界面比较简单,如下图: 第一行为Oracle数据库的连接字符串.连接成功后,填充表到第4行的下拉列表中. 第二行为实体类命名空间. 第三行为保存生成类.xml文件选择文件夹. 1 private void btnConnect_Click(object sender, RoutedEventArgs e) 2 { 3 try 4 { 5 using (OracleConnection conn = new Or

2016.5.12 用PowerDesigner做数据库逆向工程及生成实体类

一.创建数据库物理模型 1.首先打开PowerDesigner-文件-逆向工程-数据库 2.在弹出窗口中选择数据库版本,最高10g选择,确定 3.创建数据源 4.点击SetUP...设置数据源 5.填写数据库实例名 6.填写用户名,密码点击connect 7.连接成功后点确定,即可生成物理模型. 二.生成实体类 1.Tools → Generate Object-Oriented Model, 2.弹出框General页选择模型语言C#,Detail页中一定要把Check Model项取消,否则

MyEclipse从数据库反向生成实体类之Hibernate方式 反向工程

步骤大致如下: 第一步: window-->open Perspective-->MyEclipse Java Persistence 操作后会出现一个视图DB Brower:MyEclipse Derby 在空白区点击右键,新建一个数据库对象.我用的是mysql,其实我一直想用oracle之类的,只是机子内存小,又懒得倒腾别的,结果截个图吧: 左边的属性按照自己使用的数据库填就行了,左边部分是我建好以后的结果,数据库名叫mydb,有个customer表 是专门这次测试用的 第二步: 新建一个

蜗牛—Hibernate反向生成实体类及配置文件

今天学习了Hibernate的一些知识 第一步,打开myeclipse中的database视图,找到相应的表,选中后右键单击, 接下来, 蜗牛-Hibernate反向生成实体类及配置文件

在eclipse中生成实体类

1.在eclipse的windows中选中preferences在查询框中输入driver definition 2.点击add在Name/type中选中mysql jdbc driver 5.1然后点击 JAR List 3.下载个mysql-connector-java-5.1.35.jar后把把它放在项目的工作目录下后把2步骤中的mysql remove后然后添加这个工作目录下的jar包. 4.然后在data source explorer 新建个mysql连接 5.在连接的mysql中输

通过MyEclipse生成实体类及映射文件

1.在工程上添加hibernate支持,导入相关包,修改配置文件为如下: hibernate.cfg.xml文件 <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate