C#反射 字符串转为实体类,并做为参数传入泛型方法中使用
工作中有这样一个需求,有N张不同的报表,每张报表对应一个数据源,统计数据采用内存方式,首先在内在里定义了数据源对应实体。统计条件用lamdba表达式式实现,通过工具对单元格进行定义。在实现过程中针对每一张表来写取数显示是很Low的了,取数条件定义都是规则的,统计实现就是一段C#代码,但是要针对不同的数据源也就是不同的List<Entity>,通过研究发现通过泛型和反射可以实现。
根据字符串获取实体类型
private Type getEntity(string typeName)
{
var workPath = AppDomain.CurrentDomain.BaseDirectory;
string[] files = Directory.GetFiles(workPath, "XXX.Utils.dll", SearchOption.TopDirectoryOnly);
foreach (string file in files)
{
string ext = file.Substring(file.LastIndexOf("."));
if (ext != ".dll") continue;
try
{
Assembly asm = Assembly.LoadFile(file);
Type[] allTypes = asm.GetTypes();
foreach (Type t in allTypes)
{
if (t.IsSubclassOf(typeof(XXDataRecord)))
{
if (t.Name.ToUpper().IsSame(typeName.ToUpper()))
return t;
}
}
}
catch
{
return null;
}
}
return null;
}
泛型方法定义
public XXDataMemory BuildDataMemoryPattern<T>(XXParams zb, string id) where T : XXDataRecord, new()
调用方法代码
var obj = new GenerateDataHelper(_Param);
Type myGenericClassType = obj.GetType();
//MakeGenericMethod 设置泛型参数类型
MethodInfo mi = myGenericClassType.GetMethod("BuildDataMemoryPattern").MakeGenericMethod(typeEntity);
int count = ;
//设置调用方法参数
object[] invokeArgs = new object[] { zb, id, count };
//调用
var dt = (DataTable)mi.Invoke(obj, invokeArgs);
//获取回返数据
recordCount = (int)invokeArgs[];
下面是全部代码,具体功能实现略过
public class UtilFetchHelper
{
//获取实体类型
private Type getEntity(string typeName)
{
var workPath = AppDomain.CurrentDomain.BaseDirectory;
string[] files = Directory.GetFiles(workPath, "XXX.Utils.dll", SearchOption.TopDirectoryOnly);
foreach (string file in files)
{
string ext = file.Substring(file.LastIndexOf("."));
if (ext != ".dll") continue;
try
{
Assembly asm = Assembly.LoadFile(file);
Type[] allTypes = asm.GetTypes();
foreach (Type t in allTypes)
{
if (t.IsSubclassOf(typeof(XXDataRecord)))
{
if (t.Name.ToUpper().IsSame(typeName.ToUpper()))
return t;
}
}
}
catch
{
return null;
}
}
return null;
} public DataTable BuildDataMemoryPattern(XXParams zb, string id, out int recordCount)
{
//根据传入参数获取实体名称
var entityName = GetDataSourceEntityName(zb);
//获取实体类型
Type typeEntity = getEntity(entityName);
if (typeEntity == null)
return null;
var obj = new GenerateDataHelper(_Param);
Type myGenericClassType = obj.GetType();
MethodInfo mi = myGenericClassType.GetMethod("BuildDataMemoryPattern").MakeGenericMethod(typeEntity);
int count = ;
object[] invokeArgs = new object[] { zb, id, count };
var dt = (DataTable)mi.Invoke(obj, invokeArgs);
//这里获取回返数据
recordCount = (int)invokeArgs[];
return dt;
}
} public class GenerateDataHelper
{
private List<XXDataRecord> _DataList;
private List<XXDataRecord> DataList
{
set { _DataList = value; }
get { return _DataList; }
} private List<T> GetDataSource<T>() where T : XXDataRecord, new()
{
var _DataList = new List<T>();
var dt = DB.ExecuteDataTable("Select * From XX");
for (int i = ; i < dt.Rows.Count; i++)
{
var dataEnt = new T();
for (int j = ; j < dt.Columns.Count; j++)
{
dataEnt[dt.Columns[j].ColumnName] = dt.Rows[i][j];
}
_DataList.Add(dataEnt);
}
return _DataList;
} public XXDataMemory BuildDataMemoryPattern<T>(XXParams zb, string id) where T : XXDataRecord, new()
{
List<T> DataList = new List<T>();
DataList = GetDataSource<T>();
//以下是具体实现代码 针对DataList查询操作
}
}
C#反射 字符串转为实体类,并做为参数传入泛型方法中使用的更多相关文章
- C#、Python中分别是怎么实现通过字符串获取实体类的值以及给实体类赋值
一.引入 最近遇到一个项目里面的功能,在给实体类赋值的时候,由于赋值字段是动态生成的,所以如果用常用的方法(直接实体类的名称.字段名=要赋的值),将会生成很多无用的代码,所以找到了一个通过反射的赋值与 ...
- Android利用反射机制为实体类属性赋值
在做android项目时,有时会遇到从网络上获取json类型数据,赋值给实体类,实体类属性少可以一个一个的赋值,如果实体类有很多属性,赋值可能就要耗很长的功夫了,幸好Java给我们提供了反射机制.下面 ...
- 利用Java反射机制对实体类的常用操作工具类ObjectUtil
代码: ObjectUtil类: import java.lang.reflect.Field; import java.math.BigDecimal; import java.text.Simpl ...
- spring实体类(POJO)参数的赋值(form表单)原理
10.实体类(POJO)参数的赋值(form表单)原理 10.1.原理解析 测试用例 准备好两个实体类 public class Person { private String name; priva ...
- 使用反射来编写实体类的XML
前言: 开发过程中经常需要返回某实体类的列表,公司通常用的都是XML格式的接口,小猪借鉴了公司前辈留下的代码一直是类似这么写的: public static string GetXMLList(ILi ...
- ASP.NET自带对象JSON字符串与实体类的转换
关于JSON的更多介绍,请各位自行google了解!如果要我写的话,我也是去Google后copy!嘿嘿,一直以来很想学习json,大量的找资料和写demo,总算有点了解! 切入正题! 还是先封装一个 ...
- C#中怎样连接数据库并将查询结果转为实体类以及如何加入事务
场景 新建一个程序,需要对数据的表进行查询并将查询结果转换为实体类,然后将多个实体类 再插入到另一个数据库的表中,执行插入的过程中要使用事务. 注: 博客主页: https://blog.csdn.n ...
- java解析导入excel表格转为实体类javabean,根据实体类中的中文名称
最近公司需求解析excel,一开始使用poi做的挺好的,后来直接上了几十万条数据的excel文件,内存直接溢出了,网上查到apache poi还提供了专门处理海量数据的方法,使用sax解析,果然用了内 ...
- 关于spring MVC 绑定json字符串与实体类绑定
1 如果前台传json字符串,后台用@RequestBody 接收 前端 "content-Type":"application/json", 2 前台用fo ...
随机推荐
- MongoDB(课时18 修改器)
3.4.3.2 修改器(原子操作) 对MongoDB数据库而言,数据的修改会牵扯到内容的变更,结构的变更(包含数组),所以在MongoDB在设计的时候就提供有一系列的修改器的应用,那么像之前使用的“$ ...
- [ios]cocos2dx获取设备的当前预言
参考:http://blog.sina.com.cn/s/blog_923fdd9b0101fmpv.html http://bbs.9ria.com/thread-199313-1-1.html / ...
- 语言小知识-MySQL数据库引擎
MySQL作为全世界广受欢迎的数据库,被用于很多中小型的项目中,但是你对 MySQL 数据库的存储引擎了解多少呢? 我们将逻辑表中的数据存储到数据库中,数据库又将我们表中的数据存储到物理设备中(如磁盘 ...
- Jmeter JDBC的使用
1.当我们在对接口进行断言或进行多个接口串联时,常常会需要从DB查询数据来做辅助,连接JDBC需要有支持DB的jar包:官网下载地址:https://dev.mysql.com/downloads/c ...
- php--------使用js生成二维码
php生成二维码有多种方式,可以在JS中,也可以使用php库,今天写的这个小案例是使用JS生成二维码. 其他方式可以看下一篇文章:php--------php库生成二维码和有logo的二维码 网站开发 ...
- gradle 编译 No such property: sonatypeUsername错误解决
No such property: sonatypeUsername for class: org.gradle.api.publication.maven.internal.ant.DefaultG ...
- 『cs231n』作业2选讲_通过代码理解优化器
1).Adagrad一种自适应学习率算法,实现代码如下: cache += dx**2 x += - learning_rate * dx / (np.sqrt(cache) + eps) 这种方法的 ...
- CISC, RISC 探究
iPhone Simulator Intel iPhone ARM 区别很大, Intel目前的处理器主要为IA架构, IA-32即俗称x86,包括桌面处理器系列(赛扬,奔腾,酷睿等)以及服务器处 ...
- 使用poi导出Excel,并设定单元格内容类型,抛出异常
本例子使用的是HSSF,为Excel2003提供处理方案. 设定为输入类型为数值 import org.apache.poi.hssf.usermodel.DVConstraint; import o ...
- 变形CSS3
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> < ...