2015-09-13 3 views
0

Я читаю деревья выражений, и я думаю, что это хороший пример их использования, но я не могу понять, как это будет сделано.Как оценить простую строку C#

У меня есть набор строк, которые я хочу оцененный, все они типа:

exp == exp , or exp != exp , or exp (<,>,>=,<=) exp if exp is Numerical Type. 

ехру не нужен проверить, если они действительны я в порядке с их взрывать, если они не.

Моя проблема в том, как разобрать, чтобы получить реальный объект.

Я хочу передать строку, как это ниже

Owner.Property.Field == 3; 

or 

Owner.Field == 3; 

or 

Owner.Method(1) == true 

И получить, если оценка верна или нет. Моя проблема заключается в том, как мне спуститься по «пути» слева и получить значение?

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

+2

Если вы хотите, чтобы мы объяснили вам * ваш * код вам, то, возможно, вам следует опубликовать его сначала – Carsten

+0

Нет, у меня есть использование рефлексии и синтаксический анализ строк, я действительно хочу, чтобы это можно было сделать с помощью выражений. Я отредактирую для уточнения – Morphex

+0

вне зависимости от того, что вы опубликовали, что вы пробовали до сих пор - если вы ничего не пытались и хотите, чтобы мы сделали вашу работу, вам не повезло (со мной) в любом случае – Carsten

ответ

3

Вы можете использовать библиотеки генерации кода, такие как CodeDOM или Roslyn, для генерации Func, который будет выполнять оценку.

Например, в Roslyn вы можете создать Session и установить объект, содержащий Owner как Host object в Session. чем вы можете сгенерировать код в Session, как вы хотите, как следующее:

Session session = ScriptEngine.CreateSession(objectContainingOwnerAsProperty); 
bool result = session.Execute<bool>("Owner.Field == 8"); 

Теперь result будет содержать результат оценки для вашей строки без reflection, ни анализа строки.

+0

К сожалению, я не могу использовать Roslyn :(Но это будет работать в любом другом случае, я думаю, – Morphex

+0

Как насчет CodeDOM? –

+0

CodeDom возможен, но я действительно не знаю, как это работает. Любые намеки на то, как это возможно? – Morphex

Смежные вопросы