2010-11-12 50 views
3

我写一个小查找应用程序,在那里我有得心应手针对的完整性检查等高速缓存快速查询控制台..布尔聚集模式

get SomeField=Blue 

这会比得到的所有来自缓存的匹配该过滤器的对象

我可以申请多个过滤器

get SomeField=Blue && SomeOtherField < 5 

如果我决定支持()这样可以得到更多复杂的

是什么在这里使用的良好格局?或可能是一个组件,可以采取一个字符串和标记为我?

例如,我想打破下面进入过滤器

get ((field1=x || field1=y) && field2>x) 

我能想到这样做的唯一途径子集,是正则表达式,而且比子通关,以设计为不同的例程创建特定的过滤器。 (即AndEquals,OrEquals,AndGraterThan等)

回答

2

你不应该用正则表达式做到这一点,你需要一个全面的解析。看看ANTLR。

3

看看IronPython。很容易集成到一个C#应用程序中,并且已经支持所有标准的过程语言结构。我在游戏引擎中使用它来在调试时对场景状态进行实时调整。

+0

这是一个很好的建议。在更大的C#应用​​程序中嵌入IronPython或Ruby“域特定语言”非常强大。 – RationalGeek 2010-11-12 19:13:34

+0

叹了口气..听起来不错,但我真的不想为这项任务学习一种新的语言:)有没有什么特定的结构你记得我可以快速利用? – 2010-11-12 22:00:44

1

你可以在这里使用类似规范模式的东西。

public interface ISpecification<T> 
{ 
    bool IsSatisfiedBy(T instance); 
    ISpecification<T> And(ISpecification<T> specification); 
    ISpecification<T> Or(ISpecification<T> specification); 
    ISpecification<T> Not(ISpecification<T> specification); 
} 

全部工作示例here

+0

这是有趣的,但不知道它如何适用..我需要打破长输入字符串中的表达式..这似乎是强类型谓词生成器 – 2010-11-12 04:03:08

+0

恐怕你将不得不更加精确与您的原始问题。正如大卫暗示的那样,似乎您可能想通过DLR或“C#4中的动态”来研究某种动态语言功能。 – 2010-11-12 05:21:55

+0

或者当然,您可以用反射来疯狂并尝试弄清楚您的用户想要什么。 ;) – 2010-11-12 05:29:16