Извлечение строго типизированного выражения из функционального выраженияC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Извлечение строго типизированного выражения из функционального выражения

Сообщение Anonymous »

Я пытаюсь написать «расслабленный» метод сравнения, который работает с выражениями и используется в Entity Framework. Он состоит из цепочки вызовов replace() и ToLower() для выполнения неточного сопоставления составных имен.
Например, «OConnor» будет соответствовать « о'Коннор» в этом непринужденном поиске, а «жан-люк» будет соответствовать «Жан-Люку». и т. д.
Я написал вспомогательный метод, который связывает вызов replace() для каждого переданного значения, чтобы удалить значение из входной строки. Этот метод работает, но я не могу понять, как поддерживать строгую типизацию при его использовании как с выражением доступа к свойству, так и с константной строкой.
Вот строго типизированный вариант, принимающий функции. выражения, возвращающие строку:

Код: Выделить всё

private Expression ExpressionStrip(Expression exprStr, params string[] saValues)
{
if (saValues.Length == 0)
{
return exprStr.Body;
}

var exprEmptyString = Expression.Constant("");
var exprResult = Expression.Call(exprStr.Body, "Replace", null, Expression.Constant(saValues[0]), exprEmptyString);

for (var i = 1; i < saValues.Length; i++)
{
exprResult = Expression.Call(exprResult, "Replace", null, Expression.Constant(saValues[i]), exprEmptyString);
}

return exprResult;
}
Пример использования:

Код: Выделить всё

var stripped = ExpressionStrip(p => p.FullName.LastName, " ", "-", "'", "’");
Но мне также нужно выполнить то же действие с константой для сравнения:

Код: Выделить всё

var stripped2 = ExpressionStrip("Jean-Luc", " ", "-", "'", "’");
Я сделал это, используя базовый тип Expression:

Код: Выделить всё

private Expression ExpressionStrip(Expression str, params string[] saValues)
{
if (saValues.Length == 0)
{
return str;
}

var exprEmptyString = Expression.Constant("");
var exprResult = Expression.Call(str, "Replace", null, Expression.Constant(saValues[0]), exprEmptyString);

for (var i = 1; i < saValues.Length; i++)
{
exprResult = Expression.Call(exprResult, "Replace", null, Expression.Constant(saValues[i]), exprEmptyString);
}

return exprResult;
}
Я могу использовать его, передав тело выражения моего лямбда-выражения:

Код: Выделить всё

// Where exprStr is of type Expression
ExpressionStrip(exprStr.Body, " ", "-", "'", "’");
А также передав константу:

Код: Выделить всё

ExpressionStrip(Expression.Constant("Jean-Luc"), " ", "-", "'", "’");
Итак, это работает, но я потерял строгую типизацию для выражения, которое разрешает тип String, поэтому компилируется такая вещь: ExpressionStrip( Expression.Constant(true), " "), и я этого не хочу.
Я попробовал эту подпись: Expression ExpressionStrip(Expression str, params нить[] saValues), но LambdaExpression.Body возвращает Expression, который нельзя преобразовать в Expression, поэтому я не могу использовать его с моим exprStr.Body .
Можно ли каким-либо образом привести/преобразовать/извлечь строго типизированное тело функции из выражения лямбда-функции?>

Подробнее здесь: https://stackoverflow.com/questions/792 ... expression
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»