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 ...
随机推荐
- visudo使用笔记
目录前言一.介绍二.配置文件简介三.实战配置 前言: su 的确为管理带来方便,通过切换到root下,能完成所有系统管理工具,只要把root的密码交给任何一个普通用户,他都能切换到root来完成 ...
- tp5.0 composer命令插件
1.单元测试composer require topthink/think-testing 1.* (5.0) composer require topthink/think-testing 5.1官 ...
- Codeforces 525A - Vitaliy and Pie
525A - Vitaliy and Pie 思路:贪心+hashing. 代码: #include<bits/stdc++.h> using namespace std; string ...
- Short Encoding of Words
2018-07-02 09:48:48 问题描述: 问题求解: 方法一.问题给了规模n = 2000,也就是说用BF在O(n^2)的时间复杂度可以过,因此,第一个方法就是BF,但是需要注意的是这里已经 ...
- 理解Spring4.0新特性@RestController注解
参考原文 @RestController注解是它继承自@Controller注解.4.0之前的版本,spring MVC的组件都使用@Controller来标识当前类是一个控制器servlet. 使用 ...
- [Android教程] Cordova开发App入门(一)创建android项目
前言 Apache Cordova是一个开源的移动开发框架.允许使用标准的web技术-HTML5,CSS3和JavaScript做跨平台开发. 应用在每个平台的具体执行被封装了起来,并依靠符合标准的A ...
- Python下图片的高斯模糊化的优化
资源下载 #本文PDF版下载 Python下图片的高斯模糊化的优化(或者单击我博客园右上角的github小标,找到lab102的W6目录下即可) #本文代码下载 高斯模糊(一维)优化代码(和本文方法集 ...
- python-day70--django-Mysql-单表增删改查
项目名:bookmanage app01文件夹 内的 __init__.py import pymysql pymysql.install_as_MySQLdb() app01文件夹 内的models ...
- zzuli1427 NO.6校赛----数字转换
1427: 数字转换 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 572 Solved: 153 SubmitStatusWeb Board Des ...
- 015PHP文件处理——文件处理flock 文件锁定 pathinfo realpath tmpfile tempname
<?php /**文件处理flock 文件锁定 pathinfo realpath tmpfile tempname */ /*$arr=pathinfo('ab.txt');//获取文件路径的 ...