【问题标题】:More on casting Func<T,T> and Expression<Func<T,T>>更多关于转换 Func<T,T> 和 Expression<Func<T,T>>
【发布时间】:2010-01-10 00:05:43
【问题描述】:

我已经花了几个小时来解决这个问题,但还没有成功...

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

这个想法是建立一个类型为Func&lt;dynamic, dynamic&gt;的编译表达式,给定一个由类的消费者传递的Expression&lt;Func&lt;T1,T2&gt;&gt;。如果 T1 和 T2 类型在设计时已知,我已经能够解决这个问题(感谢 SO)。但我正在为设计时不知道 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?
    }
}

【问题讨论】:

  • lambdaExpression 应该是 Expression> 类型,我们想要提取 Func 类型的委托(我的原始文本没有正确显示)。
  • 感谢您的纠正,乔恩!
  • 您是使用dynamic 表示C# 4.0 dynamic 还是只是一般意义上的“动态”一词?

标签: c# dynamic lambda expression-trees


【解决方案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);
    }
}

【讨论】:

  • 我假设他不想更改函数的签名。如果可以,这是最好的解决方案。
  • 大家好,这正是我想要的!非常感谢,我真的很感激。我不敢相信我花了这么多时间来解决这个问题。但是,我在此过程中也学到了很多东西。
【解决方案2】:

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

【讨论】:

  • 问题是第二棵树需要包含类型转换,否则调用delegate会失败;我在设计时不知道类型,编译器告诉我它不能“从使用中推断出那些”......
  • 您需要在运行时构建树。您可能还需要致电Expression.Convert
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    相关资源
    最近更新 更多