.net 中创建 最简单的方式是使用 lambda 表达式:
12 | Expression |
其中 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 |
你应该注意到第 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 |
这五个扩展方法相当简单,没什么技术含量。可以根据自己需要,添加更多的扩展方法。
前面的代码简化成:
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 |
是不是好多了。
简单编码,快乐生活!
《 》系统文章从 2009 年 08 月开始写起,到现在一共有了 24 篇,欢迎阅读:
基础篇: | 、、、、、、、、 |
高级篇: | 、、、、、、、 |
变态篇: | 、、、 |
性能篇: | |
MVC篇: |