2013-09-11 3 views
3

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

Так это то, что я получил до сих пор от чтения через код и пошагового

  1. Создать экземпляр объекта, ваш expressionstring и параметры.

    T SampleString = "Some String I have"; 
    var operation= "it.Replace(@0, @1)"; 
    var operationParameters = new [] { "e", "CLOWN"}; 
    
  2. Создание объекта ParameterExpression указать тип параметра ваша работа будет выполнена на

    ParameterExpression[] parameters = new ParameterExpression[] { Expression.Parameter(typeof(T), "") }; 
    
  3. Использование класса ExpressionParser, создайте выражение, которое вы должны быть выполнены с вашего объекта

    ExpressionParser parser = new ExpressionParser(parameters, operation, operationParameters); 
    
  4. Вызывается метод анализа выражения ExpressionParser для получения сгенерированного выражения, p Ассинг это тип результата вы хотите

    var generatedExpression = parser.Parse(typeof(String)); 
    
  5. Теперь вызовите Expression.Lamba, передавая ему generatedExpression, а элемент

    var StringReplaceresult = Expression.Lambda<Func<T,String> >(generatedExpression , parameters).Compile()(item); 
    

Я не совсем уверен, что если выше является правильным, или когда именно проблема, с которой я сталкиваюсь, начинается. Я знаю, что мой компилятор не работает (5). Сообщение состоит в том, что он не передает нужное количество параметров методу Expression.Lamba. Но я задаюсь вопросом, действительно ли это проблема, поскольку, опять же, я не уверен, что получаю это даже на 60%, поэтому я был бы признателен, если кто-то, пожалуйста, исправит мою работу выше, где это необходимо.

+2

Что такое 'ExpressionParser'? Это из какой-то библиотеки? – svick

ответ

2

Я предполагаю, что вы используете динамический Linq библиотеки запросов, описанный Scott Guthrie:

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Если да, то я думаю, что вы хотите:

string sampleString = "some string I have"; 
var operation= "it.Replace(@0, @1)"; 
var operationParameters = new [] { "e", "CLOWN"}; 
Expression<Func<string, string>> expr = DynamicExpression.ParseLambda<string, string>(operation, operationParameters); 
string result = expr.Compile().Invoke(sampleString); 

Когда я запускаю это в LinqPad значение result является «somCLOWN string I havCLOWN»

DynamicExpression.ParseLambda позволяет указать типы параметров являются типичными аргументами типа, а не делают это путем явного создания массива ParameterExpression, как вы это делали.

ParseLambda<> вызов возвращает сильно типизированных Expression<TDelegate> объект, и это Compile() метод компилирует основной лямбда-выражения в исполняемый код и возвращает его в качестве делегата от правильного типа, который может быть вызван. Это означает, что Invoke() возвращает объект нужного типа (string в данном случае), а не object, который должен быть отлит. Поэтому, даже если вы начинаете с не строго типизированного кода, вы возвращаетесь к типу безопасности как можно быстрее.

http://msdn.microsoft.com/en-us/library/bb345362.aspx

P.S.

И в исходном коде у меня есть, ExpressionParser внутреннее, вы непослушный мальчик/девочка; о)

+0

Спасибо. Это сделал трюк. Что делает функция Compile() на самом деле? – Kobojunkie

+0

Обновлен мой ответ с некоторым дополнительным объяснением подхода –

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