更多关于强制转换Func <t,t>和表达式<func <t,t>&gt; </func <t,t> </t,t>

时间:2010-01-10 00:05:43

标签: c# dynamic lambda expression-trees

我花了好几个小时但没有管理......

请参阅下面的示例 - 如何做到这一点?

我们的想法是在类'使用者传递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 个答案:

答案 0 :(得分:1)

除非我不理解你的问题,否则这应该有效:

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);
    }
}

答案 1 :(得分:0)

您需要在Compile上调用LambdaExpression,然后构建并编译另一个使用Expression.Invoke(Expression, params Expression)调用该委托的表达式树。

答案 2 :(得分:0)

我自己也在寻找类似的东西。作为一个新手,我不会试图完整地回答你的问题,但也许你可以从forums.asp.net给我的答案中找到答案,我也在stackoverflow上发布了here