2013-05-03 199 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类似的语法,但它应该解析和运行。