zoukankan      html  css  js  c++  java
  • 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 即为期望的参数。

         完整示例如下:

        

     

  • 相关阅读:
    泛微云桥e-Bridge 目录遍历,任意文件读取
    (CVE-2020-8209)XenMobile-控制台存在任意文件读取漏洞
    selenium 使用初
    将HTML文件转换为MD文件
    Python对word文档进行操作
    使用java安装jar包出错,提示不是有效的JDK java主目录
    Windows server 2012安装VM tools异常解决办法
    ifconfig 命令,改变主机名,改DNS hosts、关闭selinux firewalld netfilter 、防火墙iptables规则
    iostat iotop 查看硬盘的读写、 free 查看内存的命令 、netstat 命令查看网络、tcpdump 命令
    使用w uptime vmstat top sar nload 等命令查看系统负载
  • 原文地址:https://www.cnblogs.com/camefor/p/15822031.html
Copyright © 2011-2022 走看看