Вот например, то что я писал выше, создание простого калькулятора из примера:
- ParameterExpression argument = Expression.Parameter(typeof(int), "argument");
- LambdaExpression e = DynamicExpression.ParseLambda(new ParameterExpression[] { argument }, null, "argument + argument");
Я использовал в своём приложении, очень удобно. Единство, пришлось сделать небольшой хак.
У нас есть Document, это просто класс, который наследуется от стандартного Dictionary
Я создал адаптер для документа, который имеет набор методов, которые реализуют необходимые нам функции, например вот так:
- public object field(string fieldName)
- {
- if (document.ContainsKey(fieldName))
- return document[fieldName];
- return null;
- }
- public bool regexp(string fieldName, string regexp)
- {
- if (regexp == null)
- return false;
- var pattern = new Regex(regexp);
- var field = field(fieldName);
- if (field == null)
- return false;
- return pattern.IsMatch(field.ToString());
- }
- var documentExpression = DynamicExpression.ParseLambda<Document, bool>(expression);
- Func<Document, bool> func = documentExpression .Compile();
- regexp("Field1", "0x.*") and "Test".Equals(field("Field2"));
И ещё по непонятным причинам нельзя вызывать у передаваемого объекта методы, чтобы решить эту проблему пришлось в файле Dynamic.cs за комментировать строчку:
- static bool IsPredefinedType(Type type) {
- //foreach (Type t in predefinedTypes) if (t == type) return true;
- return true;
- }
Вот так просто можно пропустить предыдущие два сообщения посвященных компиляции в .NET и просто использовать готовый класс.
Ну и напоследок ссылка на большой пример использования Dynamic LINQ To Entities Queries Using WCF/WPF demo code.
Комментариев нет:
Отправить комментарий