Подробнее о приведении Func <T, T> и Expression <Func <T, T >> - PullRequest
2 голосов
/ 10 января 2010

Я провел с этим часы, но не справился ...

Пожалуйста, посмотрите пример ниже - Как это можно сделать?

Идея состоит в том, чтобы создать скомпилированное выражение типа Func<dynamic, dynamic> с учетом Expression<Func<T1,T2>>, переданного потребителем класса. Я смог решить эту проблему (благодаря SO), ЕСЛИ типы T1 и T2 известны во время разработки. Но я ищу решение для случая, когда T1 и T2 НЕ известны во время разработки.

Возможно ли это?

Большое спасибо!

public class ExpressionExample
{
    private Func<dynamic, dynamic> _compiledExpression;

    public ExpressionExample(LambdaExpression lambdaExpression)
    {
        // How does one get a compiled expression of type
        // Func<dynamic, dynamic> at this point given lambdaExpression?
    }
}

Ответы [ 3 ]

1 голос
/ 10 января 2010

Если я не понимаю ваш вопрос, это должно работать:

public class ExpressionExample<T1, T2>
{
    private Func<dynamic, dynamic> _compiledExpression;

    public ExpressionExample(
        Expression<Func<T1, T2>> lambdaExpression)
    {
        // How does one get a compiled expression of type
        // Func<dynamic, dynamic> at this point given lambdaExpression?
        var func = lambdaExpression.Compile();
        _compiledExpression = (dynamic x) => (dynamic)func((T1)x);
    }
}
0 голосов
/ 10 января 2010

Я сам искал что-то подобное. Будучи новичком, я не буду пытаться ответить на ваш вопрос в полном объеме, но, возможно, вы сможете найти ответ из ответа, данного мне на forums.asp.net, который я также разместил прямо здесь на stackoverflow.

0 голосов
/ 10 января 2010

Вам нужно будет вызвать Compile на LambdaExpression, затем построить и скомпилировать другое дерево выражений, которое вызывает делегат, используя Expression.Invoke(Expression, params Expression).

...