Разрешение специальных выражений через IEnumerable‹MyObj›

у меня следующая модель

public class Model
 {
  public string Name {get;set;}
  public DateTime HireDate {get;set;}
  public decimal Salary {get;set;}
  public int Hours {get;set;}
 }

Теперь у меня есть следующий список

List<Model> employees = new List<Model>();

Я принимаю ввод строки выражения от пользователя, ниже приведены примеры того, что может использовать пользователь.

Зарплата

Зарплата + 500

Зарплата * Часы

СУММ(часы)

СУММА(часы * зарплата)

СУММ(Часы) / МИН (Часы)

Мне нужно обработать пользовательские выражения в другой IEnumerable либо int, либо decimal, в зависимости от расчета и того, какой тип имеет более высокую точность, например, 3-е выражение будет генерировать следующее

var result = employees.Select(e => e.Salary * e.Hours)

4-й приведет к этому

var result = employees.Sum(e => e.Hours)

В настоящее время я делаю это, сначала анализируя выражение в дереве синтаксического анализа и создавая дерево выражений, используя System.Linq.Expressions. При таком подходе получается много кода, который трудно прочитать другим разработчикам. Есть ли способ проще?


person fahadash    schedule 03.10.2013    source источник


Ответы (1)


Возможно, вместо того, чтобы делать это снова, вы могли бы найти помощь в (уже довольно старом) Блог Скотта Гу

Или, по крайней мере, это должно дать вам хорошую базу кода, чтобы заглянуть в

person MichaC    schedule 03.10.2013
comment
Этот парень использует компиляцию во время выполнения? Это создает dll в памяти каждый раз, когда выражение компилируется. И мои выражения намного проще, чем LINQ. Спасибо, что поделились. - person fahadash; 04.10.2013
comment
@fahadash Он использует материал System.Linq.Expressions, анализирует все и так далее, потому что у этого есть некоторые накладные расходы, как вы написали, вы делаете то же самое - person MichaC; 04.10.2013