2010-01-10 69 views
2

我花这个时间,但没有管理...更多关于铸造Func键<T,T>和表达<Func<T,T>>

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

这个想法是建立Func<dynamic, dynamic>类型的编译表达式,给定Expression<Func<T1,T2>>由类的消费者传递。如果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? 
    } 
} 
+0

lambda表达式应该是类型表达式>并且我们想要提取一个类型为Func 的代表(我的原始文本没有正确显示)。 – 2010-01-10 00:09:55

+0

谢谢你纠正这个,乔恩! – 2010-01-10 00:10:28

+1

您是否在使用'dynamic'来表示C#4.0'dynamic'或者只是一般意义上的“dynamic”? – jason 2010-01-10 00:13:29

回答

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

我假设他不想更改函数的签名。如果可以的话,这是最好的解决方案。 – SLaks 2010-01-10 01:08:09

+0

嗨,大家好,这正是我一直在寻找的!非常感谢,我非常感谢。我不敢相信我花了这么多时间,甚至没有接近解决方案。但是,我也学到了很多东西。 – 2010-01-10 01:34:21

+0

没问题。不要忘记标记我的答案为接受:) – Jacob 2010-01-10 02:41:13

0

你需要调用CompileLambdaExpression,然后建立和编译另一个表达式树使用Expression.Invoke(Expression, params Expression)调用该委托。

+0

问题是第二个树需要包含类型转换,否则调用委托失败;我不知道设计时的类型,编译器告诉我它不能“从使用中推断这些类型”...... – 2010-01-10 00:18:10

+0

您需要在运行时构建树。你可能还需要调用'Expression.Convert'。 – SLaks 2010-01-10 00:28:50

0

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

相关问题