加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

我知道我必须手工构建结果表达式.我无法包裹的是传递和处理属性表达.

编辑:
我想调用一个类似的方法
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; } }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读