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 ...
随机推荐
- PL/SQL Developer-官网下载地址
官网下载地址:https://www.allroundautomations.com/registered/plsqldev.html
- 【Golang 接口自动化00】为什么要用Golang做自动化?
为什么使用Golang做自动化 顺应公司的趋势学习了Golang之后,因为没有开发那么多的时间和项目来实践,怕步此前学习Java缺少练习遗忘殆尽的后尘,决定利用工作之余的时间把此前用Python的写的 ...
- angular编译机制
转载https://segmentfault.com/a/1190000011562077 Angular编译机制 前言 http://www.cnblogs.com/ztwBlog/p/620975 ...
- Netty优雅退出机制和原理
1.进程的优雅退出 1.1.Kill -9 PID带来的问题 在Linux上通常会通过kill -9 pid的方式强制将某个进程杀掉,这种方式简单高效,因此很多程序的停止脚本经常会选择使用kill - ...
- 封装DLL并调用
c# DLL封装并调用 1.封装自己的dll: a.打开visual studio - 文件 - 新建 - 项目- 类库 - 名称MyTestDll: b.右键Class1.cs - 修改为 Te ...
- synchronized同步代码块锁释放
今天发现自己写的线上程序出现数据库不能同步的问题,查看日志已经停止记录,随后使用jstack查看线程的运行状况,发现有个同步线程锁住了. 以下是jstack -l 637 问题线程的内容. &quo ...
- FasfDFS intall nginx with image filter
centOS7 x64 1. install gd-devel 2. ./configure --prefix=/usr/local/nginx --with-http_image_filter_mo ...
- protobuf3.5.1使用的简单例子
前言 1. 什么是protobuf Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,是一种轻便高效的结构化数据存储格式,平台无关 ...
- python-day6---流程控制
# if 条件:# 子代码1# 子代码2# 子代码3 # if True:# print('ok')# print('=====?>')# print('=====?>')# print( ...
- java中4种修饰符访问权限的区别
访问权限 类 本包 子类 其他包 public √ √ √ √ protected √ √ √ x default(缺省) √ √ x x private √ x x x