2010-01-10 76 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

相關問題