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

本文关键字:表达式 Imap 客户端 | 更新日期: 2023-09-27 18:07:53

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

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

应转换为以下

imap1 SEARCH SENTBEFORE 8-Sep-2011

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

谢谢!

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

将搜索函数定义为(假设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. 表达式中的任何内容都不会被求值。在你的例子中,如果你传递表达式x < DateTime.Now, DateTime。Now没有被求值为Date。为DateTime的Now属性传递了一个PropertyExpression。您需要考虑到这一点并进行评估以获得当前日期。

  2. 该示例假设您有一个简单的二进制比较。它不能满足更复杂的比较,如(m.DateReceived < DateTime.Now && m.Client == "Spog" ) || m.Ooofgle > 22932

要处理像这样更复杂的场景,您应该确保您的方法递归地沿着树向下工作以构建表达式。这很有趣,也是很好的锻炼。

通读Expression文档