SqlHelper简单实现(通过Expression和反射)3.实体,数据传输对象(DTO)Helper类设计
EntityHelper的主要功能有:
1.通过反射获取DTO的字段,主要提供给在需要从Entity获取数据后,填充给DTO并返回的作用:
通过反射获取PropertyInfo[]对象,然后取出Name属性,填入新表。
/// <summary>
/// 获取DTO字段
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static List<string> GetDTOFields<T>()
{
var fields = typeof(T).GetProperties();
return fields.Select(i => i.Name).ToList();
}
2.获取实体中的字段,主要提供在Select,Update,Insert,Join等中字段的获取,以及动态返回泛型TEntity时为反射构建Entity的对象时使用。
通过反射获取PropertyInfo[],当isFullName为true时,使用GetTableName<T>方法获取实体表名,并将表名和字段名用'.'连接
/// <summary>
/// 获取Entity实体中的字段
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="isFullName">true:字段名前面包含表名</param>
/// <returns></returns>
public static List<string> GetFields<T>(bool isFullName)
{
var fields = typeof(T).GetProperties();
var result = new List<string>();
if (isFullName)
{
var tablename = EntityHelper.GetTableName<T>();
result.AddRange(fields.Select(i => tablename + "." + i.Name));
return result;
}
result.AddRange(fields.Select(i => i.Name));
return result;
} /// <summary>
/// 获取实体中的字段,包括表名,使用","连接
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static string GetFiledString<T>()
{
var list = GetFields<T>(true).ToArray();
var result = string.Join(",", list);
return result;
}
3.获取实体代表的数据表的表名,用于构建Sql时提供表名。
前文已经介绍了自定义特性[TableName],此处就是使用这个特性反射出Entity代表的表名。
/// <summary>
/// 获取实体代表的表名
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static string GetTableName<T>()
{
var tablename = typeof(T).GetCustomAttributes(typeof(TableNameAttribute), true);
return ((TableNameAttribute)tablename[]).TableName;
} public static string GetTableName(Type entityType)
{
try
{
var tablename = entityType.GetCustomAttributes(typeof(TableNameAttribute), true);
return ((TableNameAttribute)tablename[]).TableName;
}
catch
{
throw new Exception("没有配置TableName特性!");
} }
4.获取实体代表的数据表的主键
前文已经介绍了自定义特性[Primary],此处就是使用这个特性反射出Entity代表的表中的主键。
/// <summary>
/// 获取实体主键名称
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static string GetPrimaryKey<T>()
{
var primary = typeof(T).GetCustomAttributes(typeof(PrimaryAttribute), true);
var pri = typeof(T).GetProperties();
foreach (var i in pri)
{
var pris = i.GetCustomAttributes(typeof(PrimaryAttribute), true);
if (pris.Any())
{
return i.Name;
}
}
return "";
}
SqlHelper简单实现(通过Expression和反射)3.实体,数据传输对象(DTO)Helper类设计的更多相关文章
- 基于Java反射的map自动装配JavaBean工具类设计
我们平时在用Myabtis时不是常常需要用map来传递参数,大体是如下的步骤: public List<Role> findRoles(Map<String,Object> p ...
- SqlHelper简单实现(通过Expression和反射)1.引言
之前老大说要改变代码中充斥着各种Select的Sql语句字符串的情况,让我尝试着做一个简单的SqlHelper,要具有以下功能: 1.不要在业务代码中暴露DataTable或者DataSet类型: 2 ...
- .NET基础篇——利用泛型与反射更新实体(ADO.NET Entity Framework)(转)
自从ADO.NET Entity Framework面世以来,受到大家的热捧,它封装了大量代码生成的工具,用户只需要建立好实体之间的关系,系统就是会为用户自动成功了Add.Delete.CreateO ...
- 菜鸟类库诞生记二:通过反射转换DataRow为对象
虽然大数据量的环境下,通过反射转换DataRow为对象性能会很低,但是在数据量适中的时候,这样能够减少很多的代码量,性能也确实不错. 所以在数据量不是很大的情况下,推荐使用. 如果数据量很大,可以使用 ...
- JAVA基础知识之JVM-——使用反射生成并操作对象
Class对象可以获取类里的方法,由Method对象表示,调用Method的invoke可以执行对应的方法:可以获取构造器,由Constructor对象表示,调用Constructor对象的newIn ...
- c# 反射得到实体类的字段名称和值,DataTable转List<T>
/// <summary> /// 反射得到实体类的字段名称和值 /// var dict = GetProperties(model); /// </summary> /// ...
- Java反射机制(创建Class对象的三种方式)
1:SUN提供的反射机制的类: java.lang.Class<T> java.lang.reflect.Constructor<T> java.lang.reflect.Fi ...
- java jdbc ResultSet结果通过java反射赋值给java对象
在不整合框架的情况下,使用jdbc从数据库读取数据时都得一个个的get和set,不仅累代码还显得不简洁,所以利用java的反射机制写了一个工具类,这样用jdbc从数据库拿数据的时候就不用那么麻烦了. ...
- 反射, getClass(), 和something.class以及类型类(转)
原文地址:http://www.cnblogs.com/lianghui66/archive/2012/12/03/2799134.html 所谓反射,可以理解为在运行时期获取对象类型信息的操作.传统 ...
随机推荐
- [转]jsonp详解
jsonp详解 json相信大家都用的多,jsonp我就一直没有机会用到,但也经常看到,只知道是“用来跨域的”,一直不知道具体是个什么东西.今天总算搞明白了.下面一步步来搞清楚jsonp是个什么玩意. ...
- 如何解决局域网中Windows防火墙不能访问Oracle问题!
在防火墙例外中,添加端口1521端口就样局域网内的其他机器就可以访问你的ORACLE了. 在防火墙的入站规则中,新建端口规则.过程如下例图片所示:
- PCB焊接工艺
1. 有铅焊接工艺 240~260℃. 2. BGA焊盘直径为球径80%.
- csla 与高cpu
在项目中一直使用csla 4.13. 项目一直正常,但是偶尔会出现iis占用的cpu 突然100%, 后面客户量大的情况,加入了缓存的机制.100%的情况出现的更多了. 当时有数据库死锁的原因.cpu ...
- Easyui tree方法扩展getImperfectCheck
$.extend($.fn.tree.methods, { getImperfectCheck : function (jq) { var checked = jq.find("span.t ...
- 1501: 货币系统(money)
1501: 货币系统(money) 时间限制: 1 Sec 内存限制: 64 MB 提交: 33 解决: 12 [提交][状态][讨论版] 题目描述 母牛们不但创建了它们自己的政府,而且选择建立了 ...
- keycode 大全,javascript 再也不用操心我不知道的keycode了
keycode 8 = BackSpace BackSpace keycode 9 = Tab Tab keycode 12 = Clear keycode 13 = Enter ...
- tomcat启动不起来,不知原因,没有报错日志,控制台一闪而过 怎么办
在startup.bat文件中 编辑,在最后一行回车 加上一个词pause,暂停,然后再启动就看见控制台的错误信息啦,然后就自己解决吧
- 网页或WEB应用或PC端浏览器调用百度地图API
今天在写微网页中遇见了调用百度地图这个问题:在一个容器中显示地图信息如图(设计图截图) 然后在网上查了接口:http://api.map.baidu.com/,就是这个东东,当然不止这个,还有几个必选 ...
- Android UI开发第二十九篇——Android中五种常用的menu(菜单)
Android Menu在手机的应用中起着导航的作用,作者总结了5种常用的Menu. 1.左右推出的Menu 前段时间比较流行,我最早是在海豚浏览器中看到的,当时耳目一新.最早使用左右推出菜单的,听说 ...