我目前正在开发自己的.net imap api,我想在imap SEARCH命令中使用表达式树,例如:
client.Search(m => m.DateRecieved < DateTime.Now)
应转换为以下
imap1 SEARCH SENTBEFORE 8-Sep-2011
由于我不熟悉表达式树,是否可以将该func参数转换为指定的命令?我知道我必须检查'm'的每个属性并检查是什么,但我不确定从哪里开始。
谢谢!
答案 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 );
注意强>
这只是为了让你入门。事情变得非常复杂。你必须记住的一些事情是:
表达式中的任何内容都不会被评估。因此,在您的示例中,如果您传递expresssion x < DateTime.Now
,则DateTime.Now不会被评估为Date。您将为DateTime的Now属性传递PropertyExpression。您需要满足此要求并进行评估才能获得当前日期。
该示例假设您进行了简单的二进制比较。它不适合像(m.DateReceived < DateTime.Now && m.Client == "Spog" ) || m.Ooofgle > 22932
要处理更复杂的场景,你应该确保你的方法递归地在树上运行以构建你的表达式。它很有趣,也很好运动。