微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 如何创建具有表达式作为参数的通用表达式

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; } }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐