2011-02-24 160 views
1

我有一個通用的方法與約束象下面這樣:對象的接口,但約束類型上實現該接口

private string GetResult<T>(T myObject) where T : IDoSomething<T> 
{ 
...... 
} 

現在的問題是,​​由階級,而不是由類實現接口而且對象是使用接口作爲其類型總是創造,而不是類,如:

IClassA myObject = new ClassA(); 

所以,每當泛型方法被調用時,鑄造必須在myObject作出要轉發它作爲一個參數。

是否有避免轉換並使代碼有效的方法? (除了繼承​​在IClassA選項)

回答

4

沒有,沒有辦法避免演員表演的方式。

如果你不想IDoSomething<T>IClassA通過擴展有關係,你不希望使用的具體類類型的變量做,那麼就沒有任何信息,編譯器使用推斷出你的對象在不使用強制轉換的情況下爲該方法實現正確的接口。

5

不,我不認爲你能避免投,因爲接口IClassA不以任何方式與​​。

只是一些實現了一個接口的類也碰巧實現另一個接口的事實並不能使這兩個接口兼容。

即使將IClassA對象指定回ClassA變量也需要進行明確的轉換。

0

這取決於。你只是想得到T?在這種情況下,你可以這樣做:

private static string GetResult<T>(IDoSomething<T> myObject) {}

然後T將從接口正確地推斷出(因爲IClassFoo將永遠繼承它),你不會有投。

如果你想通過它作爲T,雖然和不必投它,那麼你運氣不好,沒有你可以利用的關係。

相關問題