2013-07-17 110 views
3

有沒有辦法從泛型類中調用擴展,其中變量類也是擴展類?這是一段代碼示例。它不會編譯。我可以從泛型類中調用擴展方法嗎?

public class GenericFoo<TFrom,TTo> 
{ 
    public TTo GenericFoo(TFrom A) 
    { 
     return A.Bar(); 
    } 
} 

public static class Extensions 
{ 
    public static MyType Bar(this MyExtendedType source) 
    { 
     return new MyType(); 
    } 
} 

這將產生以下錯誤:

'TFrom' does not contain a definition for 'Bar' and the best extension method overload 'MyNamespace.Extensions.Bar(MyNamespace.MyExtendedType)' has some invalid arguments

回答

2

你可以,如果你添加一個泛型類型約束

public class GenericFoo<TFrom, TTo> 
    where TFrom : MyExtendedType 
    where TTo : MyType 
{ 
    public TTo SomeMethod(TFrom A) 
    { 
     return (TTo)A.Bar(); 
    } 
} 

這將是足以讓它來編譯,雖然如果不存在從MyTypeTTo的演員陣容,您仍然會收到運行時錯誤。

進一步閱讀

+0

好,那種失敗的泛型類的擺在首位的目的。但它似乎是準確的。 –

+1

@ArturoHernandez你怎麼能夠在不知道它的參數實際上是'MyExtendedType'的情況下調用'Bar'?泛型允許您創建具有一種或多種類型的行爲模式,而不必準確知道這些類型在編譯時會是什麼樣的,但您仍然必須知道如何使用這些類型來建立模式。 –

+0

@ArturoHernandez我建議定義一個接口'ISource',並將'Bar'定義爲Bar(ISource source),然後使用約束'where TFrom:ISource'。這樣你的泛型類就可以兼容更多類型的參數。 –

相關問題