(奇淫技巧)C# 利用反射特性,生成实际的Func<T,TResult>类型的委托,可以用于参与数据集合操作
2022/1/19 14:51:23
本文主要是介绍(奇淫技巧)C# 利用反射特性,生成实际的Func<T,TResult>类型的委托,可以用于参与数据集合操作,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
背景:一个实体类字段超级多, 且无法满足使用字典或字符串拼接表示的数据。同时有一定规则,比如 计算某某天占比,总数。例如:
/// <summary> /// 一天不合格 台数 ///</summary> public int Notconforming1Count { get; set; } /// <summary> /// 一天不合格 百分比 ///</summary> public double Notconforming1Percent { get; set; } //等等。。。 如果一直要统计 一周,一月,一季度, 一年。。。
特别说明:命名空间 System.Linq 的 Enumerable类中 有很多为实现了 IEnumerable 接口 的类 提供的 扩展方法 排序 分组 求和 求均值 等等等等 很多很多。 在文章 第二部分 就是因为要使用 Sum扩展方法 第二个参数 为 Func<TSource, double> selector ,目的就是要生成该参数。
一:利用反射特性赋值属性
大致步骤如下
- 使用typeof 关键字 或 T.GetType() 方法获取Type对象 entityType 。如: var entity = new YourClassEntity(); var entityType = entity .GetType();
- 根据规则 构造出来所有的属性名称 (字符串表示)。 如示例中 在for循环中就是这样:
var propName_Count = $"Notconforming{(7 - i).ToStr()}Count"; //规则根据自己业务来定
var propName_Percent = $"Notconforming{(7 - i).ToStr()}Percent"; - 使用entityType对象的GetProperty方法可以获取目标属性PropertyInfo 对象。如:
var propertyInfo_Count = entityType .GetProperty(propName_Count);
var propertyInfo_Percent = entityType .GetProperty(propName_Percent); - 使用 SetValue 方法 为属性赋值 语法为: propertyInfo_Count.SetValue(entity, Convert.ChangeType( 你要赋的值 , propertyInfo_Count.PropertyType), null);
- 微软文档参考: System.Reflection 命名空间 | Microsoft Docs
二:利用反射特性,根据类型中的一个属性名称 生成具体的 实际的 委托
封装方法为:
/// <summary> /// 根据属性名称 生成具体的 实际的 委托 /// </summary> /// <typeparam name="TEntity"></typeparam> /// <param name="propertyName"></param> /// <returns></returns> private static LambdaExpression CreatePropertyGetterExpression<TEntity>(string propertyName) { var entityType = typeof(TEntity); PropertyInfo property = entityType.GetProperty(propertyName); var parameter = Expression.Parameter(entityType, "e"); var body = Expression.MakeMemberAccess(parameter, property); return Expression.Lambda(body, parameter); }
使用方式:
var myDelegate CreatePropertyGetterExpression<你的实体类型>(propName_Percent).Compile(); //propName_Percent 为属性名称 字符串表示
//CreatePropertyGetterExpression根据传入的类型 与 属性名称 生成 LambdaExpression 表达式 对象
//调用Compile 生成表示 lambda 表达式的委托。
var actualDelegate = (Func<你的实体类型, double>)myDelegate; //doublue 为 Tresult中的返回值类型 根据你的属性决定。
此时 actualDelegate 即为期望的参数。
完整示例如下:
这篇关于(奇淫技巧)C# 利用反射特性,生成实际的Func<T,TResult>类型的委托,可以用于参与数据集合操作的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具