C#Imap客户端 - 表达式树的使用

时间:2011-09-08 09:35:12

标签: c# lambda imap expression-trees

我目前正在开发自己的.net imap api,我想在imap SEARCH命令中使用表达式树,例如:

client.Search(m => m.DateRecieved < DateTime.Now)

应转换为以下

imap1 SEARCH SENTBEFORE 8-Sep-2011

由于我不熟悉表达式树,是否可以将该func参数转换为指定的命令?我知道我必须检查'm'的每个属性并检查是什么,但我不确定从哪里开始。

谢谢!

1 个答案:

答案 0 :(得分:1)

开始将搜索功能定义为(假设m是一个名为Splog的类):

void Search (Expression<Func<Splog, bool>> searchExpression) 

然后乐趣开始了。

然后你可以做点什么:

string comparison= "";
string compare1= "";
string compare2 = "";

if ( searchExpression.Body is BinaryExpression ) // Ensure the expression is a comparison..
{
    if ( searchExpression.Body.NodyType == ExpressionType.LessThan )
        comparison = "SENTBEFORE";
    else if ( searchExpression.Body.NodyType == ExpressionType.GreaterThan )
        comparison = "SENTAFTER";
    else  if ( searchExpression.Body.NodyType == ExpressionType.Equal )
        comparison = "EQUALS";

    // Then evaluate the left and right portions.
    if ( ( searchExpression.Body as BinaryExpression ).Left is MemberExpression )
         compare1 = ( ( searchExpression.Body as BinaryExpression ).Left as MemberExpression).Member.Name;

    if ( ( searchExpression.Body as BinaryExpression ).Right is MemberExpression )
         compare2 = ( ( searchExpression.Body as BinaryExpression ).Right as MemberExpression).Member.Name;

}

Console.WriteLine ( compare1 + " " + comparison + " " + compare2 );

注意

这只是为了让你入门。事情变得非常复杂。你必须记住的一些事情是:

  1. 表达式中的任何内容都不会被评估。因此,在您的示例中,如果您传递expresssion x < DateTime.Now,则DateTime.Now不会被评估为Date。您将为DateTime的Now属性传递PropertyExpression。您需要满足此要求并进行评估才能获得当前日期。

  2. 该示例假设您进行了简单的二进制比较。它不适合像(m.DateReceived < DateTime.Now && m.Client == "Spog" ) || m.Ooofgle > 22932

  3. 这样的更复杂的比较

    要处理更复杂的场景,你应该确保你的方法递归地在树上运行以构建你的表达式。它很有趣,也很好运动。

    彻底阅读Expression documentation