其他分享
首页 > 其他分享> > 我如何创建一个动态表达式,如(x,y)=> DateTime.Compare(y.EFFECTIVE_DATE,x.EFFECTIVE_DATE)

我如何创建一个动态表达式,如(x,y)=> DateTime.Compare(y.EFFECTIVE_DATE,x.EFFECTIVE_DATE)

作者:互联网

我是较新的编码器,使用表达式树动态创建以下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 Method中:

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

return expr;
}

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

我只是想实现目标而已吗?

对不起,很抱歉,感谢您的帮助.

解决方法:

好了,您可以使用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,expression-trees
来源: https://codeday.me/bug/20191031/1973953.html