2012-06-19 69 views
0

我有一個Func<T, string>,我想轉換爲Func<dynamic, string>。可能嗎?有沒有辦法將Func <T, string>轉換爲Func <dynamic,string>?

+1

如果你有一個'Func鍵'那麼FUNC預計類型T'的'的值。你當然可以在它周圍包裝一個'Func ',但如果'dynamic'參數不是'T'的實例,它將在運行時失敗。如果沒有'Func '作爲表達式樹,就沒有辦法分解它,而是用動態參數重新組裝它。 –

+0

很好的答案和每個人的意見。答案很簡單,正如你在下面看到的,我只是很疲倦地看到它。 –

回答

6

你在這裏。只需要決定你想要做什麼,當你的動態值不T類型:

public Func<dynamic, string> ConvertToDynamicFunc<T>(Func<T, string> typedFunc) 
{ 
    Func<dynamic, string> dynamicFunc = (input) => 
    { 
     if (input is T) 
      return typedFunc((T)input); 

     return null; //or throw? 
    }; 

    return dynamicFunc; 
} 

Func<int, string> typedFunc = (input) => input.ToString(); 
Func<dynamic, string> dynamicFunc = ConvertToDynamicFunc(typedFunc); 
System.Console.WriteLine(dynamicFunc(10));//outputs "10"; 
System.Console.WriteLine(dynamicFunc(10.5));//outputs null since a double isn't an int (type T) or throw if you prefer; 
4

肯定的:

Func<T, string> input = ... 
Func<dynamic, string> output = x => input(x); 

當然,如果你有不兼容的類型執行的委託,你會得到一個RuntimeBinderException

+0

當然,但如果輸入到'output'不是'T',那麼在運行時會失敗。 (即使動態參數duck-typed相同的成員)雖然承認這是你可以做的最好的。 –

+0

@KirkWoll:當然,但如果你首先願意使用動態,你顯然已經評估過風險,並且無論如何都要繼續。 – Ani

+0

我的意思是,如果你首先編寫一個基於動態的實現,比如'Func foo = x => x.SomeMethod();'然後將它與使用你的技術時得到的結果進行比較,如果你的技術比原始技術強大得多,那麼效果會有顯着差異。只是認爲這是值得一提的。 –

相關問題