博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c# 扩展方法奇思妙用基础篇九:Expression 扩展
阅读量:6477 次
发布时间:2019-06-23

本文共 2426 字,大约阅读时间需要 8 分钟。

.net 中创建 最简单的方式是使用 lambda 表达式:

12
Expression
> exp = p => p.Name.Contains("ldp") && p.Birthday.Value.Year > 1990;

其中 Person 类定义如下:

1234
public class Person {    public string Name { get; set; }    public DateTime? Birthday { get; set; }}

 

但有些时候,要动态创建 ,我们要用到 命名空间中的 。

使用 中的静态方法,前面的 可如下创建:

12345678910
var parameter = Expression.Parameter(typeof(Person), "p");var left = Expression.Call(    Expression.Property(parameter, "Name"),    typeof(string).GetMethod("Contains"),    Expression.Constant("ldp"));var right = Expression.GreaterThan(    parameter, "Birthday"), "Value"), "Year"),    Expression.Constant(1990));var body = Expression.AndAlso(left, right);var lambda = Expression.Lambda
>(body, parameter);

你应该注意到第 7 行高亮部分,三个重复的 Expression.Property,显得非常臃肿,导致可读性也很差。

可以用下面几个扩展方法予以简化:

1234567891011121314151617
public static class ExpressionExtensions {    public static Expression AndAlso(this Expression left, Expression right) {        return Expression.AndAlso(left, right);    }    public static Expression Call(this Expression instance, string methodName, params Expression[] arguments) {        return Expression.Call(instance, instance.Type.GetMethod(methodName), arguments);    }    public static Expression Property(this Expression expression, string propertyName) {        return Expression.Property(expression, propertyName);    }    public static Expression GreaterThan(this Expression left, Expression right) {        return Expression.GreaterThan(left, right);    }    public static Expression
ToLambda
(this Expression body, params ParameterExpression[] parameters) { return Expression.Lambda
(body, parameters); }}

这五个扩展方法相当简单,没什么技术含量。可以根据自己需要,添加更多的扩展方法。

前面的代码简化成:

1234
var parameter = Expression.Parameter(typeof(Person), "p");var left = parameter.Property("Name").Call("Contains", Expression.Constant("ldp"));var right = parameter.Property("Birthday").Property("Value").Property("Year").GreaterThan(Expression.Constant(1990));var lambda = left.AndAlso(right).ToLambda
>(parameter);

是不是好多了。

简单编码,快乐生活!

》系统文章从 2009 年 08 月开始写起,到现在一共有了 24 篇,欢迎阅读:
基础篇: 、、、、、、、、
高级篇: 、、、、、、、
变态篇: 、、、
性能篇
MVC篇:

转载于:https://www.cnblogs.com/ldp615/archive/2011/09/15/expression-extension-methods.html

你可能感兴趣的文章
《你有多少问题要请示》精华集粹
查看>>
打印图片
查看>>
SHOW CREATE DATABASE Syntax
查看>>
rsync常见问题及解决办法
查看>>
MySQL日期 专题
查看>>
C#中禁止程序多开
查看>>
分布式缓存Redis使用以及原理
查看>>
Activity竟然有两个onCreate方法,可别用错了
查看>>
Linux经常使用命令(十六) - whereis
查看>>
Linux五种IO模型
查看>>
Bootstrap技术: 模式对话框的使用
查看>>
小知识,用myeclipes找jar
查看>>
in-list expansion
查看>>
设计原则(四):接口隔离原则
查看>>
基于react的滑动图片验证码组件
查看>>
java单例模式深度解析
查看>>
【学习笔记】阿里云Centos7.4下配置Nginx
查看>>
VuePress手把手一小時快速踩坑
查看>>
学习constructor和instanceof的区别
查看>>
Vijos P1881 闪烁的星星
查看>>