2013-05-03 250 views
1

我有Func<Message, bool>其中Message是我的一個類。不區分大小寫Func

我建立一個Lambda並把它編譯成Func<Message,bool>

public static Func<Classes.Message, bool> GetPredicate(string expression) 
{ 
    Func<Classes.Message, bool> result = null; 

    try 
    { 
     ParameterExpression parameter = Expression.Parameter(typeof(Classes.Message), "Message"); 
     var lambda = DynamicExpression.ParseLambda(new[] { parameter }, null, expression); 
     result = lambda.Compile() as Func<Classes.Message, bool>; 
    } 
    catch (Exception e) 
    { 
     _log.Fatal(e); 
    } 

    return result; 
} 

這導致

Message => (((Message.ContainsProperty("Gender") == True) AndAlso (Message.GetPropertyValue("Gender") != "Female")) AndAlso (Message.ChannelString != "FacebookComment")) 

後來,Func得到執行,但我想使它的情況下,鈍感所以當消息對象被傳入但性別是「女性」而不是「女性」時,它仍會在布爾中返回true。

這可能嗎?

感謝

+1

那麼,你自己在創建'表達式'嗎? – 2013-05-03 09:28:09

+0

是的,它是一個字符串。 – Jon 2013-05-03 09:29:05

+0

什麼是進來的字符串?正如ispiro在他的回答中所說的那樣,該屬性可能會應用ToUpper(),或者您可以改爲使用'string.compare'(假設lambda分析器支持該屬性)。 – 2013-05-03 09:31:51

回答

1

使用ToUpper()

Message.GetPropertyValue("Gender").ToUpper() != "FEMALE" 
0

這是從表達式生成的。

我相當肯定,在字符串中的靜態公共方法是通過DynamicQuery暴露出來,所以你需要給你的String.Compare:

(x) => String.Compare (x.Gender, "Female", StringComparison.OrdinalIgnoreCase) 

不幸的是,這將意味着你不能使用sql類似的語法,但它應該解析和運行。