ASP.Net MVC中有一个displayNameFor(x => x.Title)帮助器.
我想在行为中实现类似的东西.
我想在行为中实现类似的东西.
我希望有一个方法接受基于User类(u => u.Birthdate或u => u.Name)的表达式,操作数(Greater,Less,Equal)和类似DateTime.Now的值并返回表达式u => u.Birthdate> DateTime.Now
我知道我必须手工构建结果表达式.我无法包裹的是传递和处理属性表达.
编辑:
我想调用一个类似的方法
GetFilterPredicate(U => u.Birthdate,FilterOps.GreaterThan,DateTime.Parse( “2013年1月1日”)
要么
GetFilterPredicate(U => u.someIntProperty,FilterOps.Equals,2)
更新:我创建了一个包含此问题解决方案的repo以及集合属性过滤
https://github.com/Alexander-Taran/Lambda-Magic-Filters
解决方法
这满足了您的需求吗?
[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; } }