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'的每个属性,检查什么是什么,但我不太确定从哪里开始。
谢谢!
将搜索函数定义为(假设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 );
注意
这只是让你开始。事情很快就会变得复杂。你必须记住以下几点:
表达式中的任何内容都不会被求值。在你的例子中,如果你传递表达式
x < DateTime.Now
, DateTime。Now没有被求值为Date。为DateTime的Now属性传递了一个PropertyExpression。您需要考虑到这一点并进行评估以获得当前日期。该示例假设您有一个简单的二进制比较。它不能满足更复杂的比较,如
(m.DateReceived < DateTime.Now && m.Client == "Spog" ) || m.Ooofgle > 22932
要处理像这样更复杂的场景,您应该确保您的方法递归地沿着树向下工作以构建表达式。这很有趣,也是很好的锻炼。
通读Expression文档