c# - 如何创建动态表达式,如 ( x, y ) => DateTime.Compare( y.EFFECTIVE_DATE, x.EFFECTIVE_DATE )

标签 c# expression-trees

我是一名新编码员,在使用表达式树动态创建以下 lamdba 表达式时遇到了很多问题。

( x, y ) => DateTime.Compare( y.EFFECTIVE_DATE, x.EFFECTIVE_DATE )

我刚刚开始了解表达式树的基础知识,但似乎还不足以创建它。我没有任何好的代码可以真正放在这里,因为老实说我真的在摸索这个。任何帮助都会很棒。

提前致谢。

抱歉,第一次发帖,在格式化项目时遇到了一些问题。

所以,在我的主要方法中,我有以下内容:

var sortExpression = testing.GetExpression( "EFFECTIVE_DATE", "EFFECTIVE_DATE");

        if (e.SortDirection == SortDirection.Ascending)
        {
            paymentAuthorizationList.Sort( sortExpression );  
        }

并且,在我的 Get Expression 方法中:

    public Expression<Func<AuthorizePayments, AuthorizePayments, int >> GetExpression<t>( string propertyName, string propertyValue )
    {

        var paramX = Expression.Parameter( typeof( AuthorizePayments ), "x" ); // x
        var paramY = Expression.Parameter( typeof( AuthorizePayments ), "y" ); // y

        var xDate = Expression.Property( paramX, "EFFECTIVE_DATE" ); // x.EFFECTIVE_DATE
        var yDate = Expression.Property( paramY, "EFFECTIVE_DATE" ); // y.EFFECTIVE_DATE

        // DateTime.Compare(y.EFFECTIVE_DATE, x.EFFECTIVE_DATE)
        var body = Expression.Call( typeof( DateTime ).GetMethod( "DateTime.Compare" ), yDate, xDate );

        // (x, y) => DateTime.Compare(y.EFFECTIVE_DATE, x.EFFECTIVE_DATE)
        var expr = Expression.Lambda<Func<AuthorizePayments, AuthorizePayments, int >>( body, paramX, paramY );

返回表达式;

我知道此时变量是错误的。排序表达式不适用于排序方法。

我是否偏离了我正在努力做的事情的基础?

抱歉我的无知,感谢您的帮助。

最佳答案

好吧,您可以在编译器的帮助下使用 lambda 表达式“静态地”创建它:

Expression<Func<Foo, Foo, int>> expr =
            (x, y) => DateTime.Compare(y.EFFECTIVE_DATE, x.EFFECTIVE_DATE);

如果您想“手动”完成:

var paramX = Expression.Parameter(typeof(Foo), "x"); // x
var paramY = Expression.Parameter(typeof(Foo), "y"); // y

var xDate = Expression.Property(paramX, "EFFECTIVE_DATE"); // x.EFFECTIVE_DATE
var yDate = Expression.Property(paramY, "EFFECTIVE_DATE"); // y.EFFECTIVE_DATE

// DateTime.Compare(y.EFFECTIVE_DATE, x.EFFECTIVE_DATE)
var body = Expression.Call(typeof(DateTime).GetMethod("Compare"), yDate, xDate);

// (x, y) => DateTime.Compare(y.EFFECTIVE_DATE, x.EFFECTIVE_DATE)
var expr = Expression.Lambda<Func<Foo, Foo, int>>(body, paramX, paramY);

关于c# - 如何创建动态表达式,如 ( x, y ) => DateTime.Compare( y.EFFECTIVE_DATE, x.EFFECTIVE_DATE ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15114527/

相关文章:

c# - 如果我不收集垃圾,为什么服务器垃圾收集速度更快?

c# - WPF 图像 - 尝试使用 TreeView ,但无法使背景清晰

c# - 为任何方法创建 Func 或 Action(在 C# 中使用反射)

c# - 如何合并两个成员表达式树?

user-interface - 需要评估 bool 逻辑树的指导

c# - Lambda 表达式树解析

c# - Task.Run() 和 Task.Delay() 一段时间后终止

c# - 如何在 C# 中设置/更改/删除按钮上的焦点样式?

c# - Power BI Embedded - 嵌入图 block

c# - 从字符串到方法