ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

(奇淫技巧)C# 利用反射特性,生成实际的Func<T,TResult>类型的委托,可以用于参与数据集合操作

2022-01-19 14:33:00  阅读:182  来源: 互联网

标签:Count propName C# entityType Percent Func var 奇淫 属性


背景:一个实体类字段超级多, 且无法满足使用字典或字符串拼接表示的数据。同时有一定规则,比如 计算某某天占比,总数。例如:

     
        /// <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 即为期望的参数。

     完整示例如下:

    

 

 

 

 

 

标签:Count,propName,C#,entityType,Percent,Func,var,奇淫,属性
来源: https://www.cnblogs.com/camefor/p/15822031.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有