c# – 如何创建具有表达式作为参数的通用表达式
发布时间:2020-12-16 01:58:14 所属栏目:百科 来源:网络整理
导读:ASP.Net MVC中有一个DisplayNameFor(x = x.Title)帮助器. 我想在行为中实现类似的东西. 我希望有一个方法接受基于User类(u = u.Birthdate或u = u.Name)的表达式,操作数(Greater,Less,Equal)和类似DateTime.Now的值并返回表达式u = u.Birthdate DateTime.Now
ASP.Net MVC中有一个DisplayNameFor(x => x.Title)帮助器.
我想在行为中实现类似的东西. 我希望有一个方法接受基于User类(u => u.Birthdate或u => u.Name)的表达式,操作数(Greater,Less,Equal)和类似DateTime.Now的值并返回表达式u => u.Birthdate> DateTime.Now 我知道我必须手工构建结果表达式.我无法包裹的是传递和处理属性表达. 编辑: 更新:我创建了一个包含此问题解决方案的repo以及集合属性过滤 解决方法
这满足了您的需求吗?
[TestClass] public class UnitTest1 { public Expression<Predicate<T>> GetFilterPredicate<T,R>(Expression<Func<T,R>> selector,FilterOps operand,R value) { var parameter = selector.Parameters[0]; var left = selector.Body; var right = Expression.Constant(value); var binaryExpression = Expression.MakeBinary(operand.ToExpressionType(),left,right); return Expression.Lambda<Predicate<T>>(binaryExpression,parameter); } [TestMethod] public void TestMethod1() { var p1 = this.GetFilterPredicate((User u) => u.Birthday.TimeOfDay.Hours,FilterOps.LessThan,12); var p2 = this.GetFilterPredicate((User u) => u.Size,FilterOps.Equal,180); var user = new User() { Birthday = new DateTime(2000,1,1),Size = 180 }; Assert.IsTrue(p1.Compile()(user)); Assert.IsTrue(p2.Compile()(user)); } } public enum FilterOps { GreaterThan,LessThan,Equal } public static class MyExtensions { public static ExpressionType ToExpressionType(this FilterOps operand) { switch (operand) { case FilterOps.GreaterThan: return ExpressionType.GreaterThan; case FilterOps.LessThan: return ExpressionType.LessThan; case FilterOps.Equal: return ExpressionType.Equal; default: throw new NotSupportedException(); } } } public class User { public DateTime Birthday { get; set; } public int Size { get; set; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |