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

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...