2013-10-03 1 views
2

У меня есть следующие моделиПозволить одноранговые выражения над 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

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

SUM (часы)

SUM (часы * з)

SUM (часы)/мин (часы)

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

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

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

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

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

ответ

0

Может быть, вместо того, чтобы делать это снова вы могли бы найти помощь на (уже довольно старый) Scott Gu's Blog

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

+0

Является ли этот парень с помощью выполнения -компиляция? Это создает dll в памяти каждый раз, когда выражение компилируется. И мои выражения намного упрощены, чем LINQ. Спасибо, что поделились ею. – fahadash

+0

@fahadash Он использует материал 'System.Linq.Expressions', разбирает все и т. Д., Из-за чего у этого есть некоторые накладные расходы, вы написали, что делаете то же самое – MichaC