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 所谓反射,可以理解为在运行时期获取对象类型信息的操作.传统 ...
随机推荐
- iOS 学习笔记四 【xcode 7.3 ESJsonFormat-Xcode 插件不能使用的解决办法】
步骤: 1.[前提要[关掉xcode],然后终端运行,一次不行,运行两次!] 2.[鼠标双击下方代码,command + c 复制即可] 3.[打开终端,command + V 粘贴,按回车运行即可, ...
- PLSQL配置数据库的方式
1.直接连接的方式 2.修改客户端D:\app\Administrator\product\11.2.0\client_1\network\admin\tnsnames.ora文件的方式. ora ...
- 华为HiAI 助力苏宁易购,让你尽享完美视觉购物体验!
还在感慨商品照片与实物存在差距,又要退货? 还在抱怨被忽视的图片小细节,影响了生活品质? 想要“买买买”, 又担心海量的商品图片耗光你的流量? 就在近期 搭载HiAI能力的苏宁易购新版上线, 让你畅快 ...
- ffmpeg 错误系统
avcodec_decode_video2. returns -1094995529. #define AVERROR_INVALIDDATA FFERRTAG( 'I','N','D','A') ...
- Windows之建立C++开发环境
下载:https://yun.baidu.com/s/1pK7j4Fp 解压得到 把myMingw文件夹复制系统根目录下. 添加C:\myMingw\bin到系统环境变量 双击make-3.81.ex ...
- AJAX是基于现有的Internet标准
AJAX是基于现有的Internet标准 AJAX是基于现有的Internet标准,并且联合使用它们: XMLHttpRequest 对象 (异步的与服务器交换数据) JavaScript/DOM ( ...
- SlidingMenu官方实例分析7——SlidingContent和SlidingTitleBar区别
包含ActionBar:setSlidingActionBarEnabled(true); 效果图: 不包含ActionBar:setSlidingActionBarEnabled(false); 效 ...
- OpenCV学习笔记九:opencv_stitching模块
一,简介: 该库用于图像拼接.
- day2 python基础 while 循环补充
一.上节内容回顾 二.pycharm安装. 安装好以后激活方法:直接打开pycharm,选License server激活,输入:http://idea.imsxm.com 三.补充知识:如果字符串本 ...
- CMU-15445 LAB3:事务隔离,two-phase locking,锁管理器
概述 本lab将实现一个锁管理器,事务通过锁管理器获取锁,事务管理器根据情况决定是否授予锁,或是阻塞等待其它事务释放该锁. 背景 事务属性 众所周知,事务具有如下属性: 原子性:事务要么执行完成,要么 ...