паттерны логической агрегации в c # - PullRequest
3 голосов
/ 12 ноября 2010

Я пишу небольшое справочное приложение, в котором у меня есть удобная консоль для быстрых запросов к кешу для проверки работоспособности и т. Д.

т.е.

get SomeField=Blue

тогда получим все объекты из кэша, соответствующие этому фильтру.

Я могу применить больше фильтров

get SomeField=Blue && SomeOtherField < 5

это может стать более сложным, если я решу поддержать ()

Какой хороший шаблон использовать здесь? или, возможно, компонент, который может взять строку и токенизировать ее для меня?

например, я бы хотел разбить следующее на подмножество фильтров

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

единственный способ, которым я могу думать об этом, это регулярное выражение, а затем передать подстроки различным подпрограммам, предназначенным для создания определенного фильтра. (т.е. AndEquals, OrEquals, AndGraterThan и т. д.)

Ответы [ 3 ]

3 голосов
/ 12 ноября 2010

Посмотрите на IronPython. Его легко интегрировать в приложение c #, и он уже поддерживает все стандартные процедурные языковые конструкции. Я использую его в игровом движке для выполнения в реальном времени настройки состояния сцены во время отладки.

2 голосов
/ 12 ноября 2010

Вы не должны делать это с регулярным выражением, вам нужен полноценный парсер.Посмотрите на ANTLR.

1 голос
/ 12 ноября 2010

Вы можете использовать что-то вроде шаблона спецификации здесь.

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);
}

Полный рабочий пример здесь

...