2010-11-12 72 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