2012-09-25 103 views
24

我喜歡發送一個泛型類型轉換函數的方法,但我不知道如何去做。如何傳遞一個泛型類型參數的func?

這裏是無效的語法解釋什麼,我想實現,問題是我不知道怎麼跟我的FUNC一起指定泛型類型:

public void SomeUtility(Func<T><object,T> converter) 
{ 
    var myType = converter<MyType>("foo"); 
} 

編輯(也看到評論我的討論勞倫斯):通過「通用型變頻器」我的意思是我想的,可以轉換到任何強力型<牛逼>(不是對象)轉換器來傳遞,所以在我的方法中的下一行可能是:

var myOtherType = converter<MyOtherType>("foo"); 

我喜歡p的代表屁股作爲參數會是這個樣子:

private delegate TOutput myConverterDelegate<TOutput>(object objectToConvert); 

這更多的是一種語法/ C#的探索,現在,把事情做好,我可能會用一個接口代替,但我希望這是可能的一個實現FUNC /委託。

+0

事實上,你在方法體內指定了一個類型是重要的嗎?您是否暗示此方法可能需要針對多種類型進行轉換,而不是調用方定義的一種特定類型? –

+0

是的,這是我試圖表達爲「泛型類型轉換器」,所以下一行可能會變成myOtherType = converter (「foo」); – joeriks

+0

好的 - 那麼我認爲你會發現我的答案有用:) –

回答

19

你不能通用的功能或操作實例 - 所有類型參數的定義前期,不能被調用者重新定義。

一個簡單的方法是依靠下鑄造完全避免多態性

public void SomeUtility(Func<Type, object, object> converter) 
{ 
    var myType = (MyType)converter(typeof(MyType), "foo"); 
} 

如果你想輸入的安全,就需要推遲類型參數給調用者的定義。

public void SomeUtility(IConverter converter) 
{ 
    var myType = converter.Convert<MyType>("foo"); 
} 

interface IConverter 
{ 
    T Convert<T>(object obj); 
} 

編輯:

如果「轉換型」是在調用點可知,只有這種類型將被內部使用,您可以通過一個界面中,組成一個通用的方法,這樣做該實用程序方法,那麼您可以在該方法上定義泛型類型並使用該類型,就像其他海報所建議的一樣。

+0

好的,謝謝,是的,我可能只是使用一個接口,謝謝指向我的方向。但是,出於興趣,不應該委託/函數能夠傳遞泛型?描述爲委託我想我會寫它:私人委託TOutput myConverterDelegate (object objectToConvert); - 但是當我嘗試使用它作爲參數時,我會得到「需要1個類型參數」 – joeriks

+1

您當然可以*定義*通用委託,畢竟這正是Func和Action所做的。它們被視爲通用定義*,就像通用接口和類一樣。但是,您不能在方法簽名中使用*泛型定義*,只能使用參數化*泛型類型*。很簡單,你不能單靠你的代表來完成你想要達到的目標。 –

7

您還需要製作SomeUtility通用。這樣做的,固定的語法給出:

public void SomeUtility<T>(Func<object,T> converter) 
{ 
    var myType = converter("foo"); 
} 
15
public void SomeUtility<T>(Func<object, T> converter) 
{ 
    var myType = converter("foo"); 
} 

然後:

SomeUtility(arg => new MyType()); 

通用的類型推斷將在這種情況下工作。

+0

這個應該被接受 –

3

你必須在編譯時知道T類型才能使用它。 T可以在類級或方法級指定。

class SomeClass<T> { 
    public void SomeUtility(Func<object, T> converter) { 
     var myType = converter("foo"); // Already is the T-type that you specified. 
    } 
} 

public void SomeUtility<T>(Func<object, T> converter) { 
    var myType = converter("foo"); // Already is the T-type that you specified. 
} 
相關問題