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 ...
随机推荐
- QString 编码转换
参考网址:http://blog.csdn.net/lfw19891101/article/details/6641785 (网页保存于:百度云CodeSkill33 --> 全部文件 > ...
- zlib__ZC
官网:http://www.zlib.net/ ,所有版本下载:http://www.zlib.net/fossils/ ZC: 我下载的是 zlib-1.2.3.tar.gz 和 zlib-1.2. ...
- php 四种基础排序
1. 冒泡排序算法 * 思路分析:法如其名,就是像冒泡一样,每次从数组当中 冒一个最大的数出来. * 比如:2,4,1 // 第一次 冒出的泡是4 * ...
- URAL 2072 Kirill the Gardener 3
URAL 2072 思路: dp+离散化 由于湿度的范围很大,所以将湿度离散化 可以证明,先到一种湿度的最左端或者最右端,然后结束于最右端或最左端最优,因为如果结束于中间,肯定有重复走的路 状态:dp ...
- 推荐一款基于Angular实现的企业级中后台前端/设计解决方案脚手架
ng-alain 是一个企业级中后台前端/设计解决方案脚手架,我们秉承 Ant Design 的设计价值观,目标也非常简单,希望在Angular上面开发企业后台更简单.更快速.随着『设计者』的不断反馈 ...
- 原生js的博客
原生js一里边还有很多二三等http://www.cnblogs.com/charling/p/3527561.html 选区器 http://wenku.baidu.com/link?url=zr2 ...
- Git工作区、暂存区和版本库
基本概念 我们先来理解下Git 工作区.暂存区和版本库概念 工作区:就是你在电脑里能看到的目录. 暂存区:英文叫stage, 或index.一般存放在 ".git目录下" 下的in ...
- 二分检索函数lower_bound()和upper_bound()
二分检索函数lower_bound()和upper_bound() 一.说明 头文件:<algorithm> 二分检索函数lower_bound()和upper_bound() lower ...
- [转] jquery $.ajax/$(document).ready is not a function的问题
下午完成了一个模块功能的开发,本来测试好的jquery表单验证怎么也出不来了.打开firebug,看到控制台里赫然提示:$(document).ready is not a function.感觉怪怪 ...
- Lightoj Halloween Costumes
题意:给出要n个时间穿的服装.服装脱下就不能再穿.问最少要准备多少? dp[i][j]表示i到j之间最少花费.如果n=1(n指长度),肯定结果为1,n=2时,也很好算.然后n=3的时候dp[i][j] ...