2013-10-31 45 views
0

比方說,我有這個類你能在C#擴展了一般類

public Holder<T> : IHolder 
{ 
    private mystring; 
    private myobj; 

    public Holder(T obj, string str) 
    { 
     mystring = str; 
     myobj = obj; 
    } 
} 

然後我想有座< T>擴展T,這樣我就可以用持有人< T>,我會正常T.有沒有辦法做到這一點?

因此,例如,我想Holder < int>被視爲int。

只要添加:T不起作用,但我很好奇,如果有另一種方式。

隱式轉換是行不通的,因爲我希望它能夠進去,例如一個IEnumerable < int>的

+1

嘗試一下,看看(這是關於3個按鍵,將工作或導致適用的錯誤信息)。然而,對T的一個*隱式轉換可能會起作用? – user2864740

+0

你是什麼意思「延長T」?繼承它? – gunr2171

+0

所以你想持有人被視爲一個int(例如)? –

回答

4

泛型在.NET中實現的方式要求所有Foo<T>必須表現很大程度上是同樣的方式,不管T。除其他外,所有Foo<T>必須具有相同的成員,僅限於成員可能在其定義中包含T的事實。如果Foo<T>可能從T繼承,知道什麼成員Foo<T>暴露將需要知道什麼成員T暴露,這當然可以完全不同Foo<Automobile>Foo<Cat>。如果有人知道Foo<T>只能用於從例如Animal,人們可以定義一個class Foo<T> : Animal where T:Animal,但那隻會允許Foo<Cat>作爲Animal使用 - 不能作爲Cat使用。

在許多情況下,然而,真正需要的不是一個類型Foo<T>這實際上繼承T,而是創建一個對象它很像T的能力,但也有一些差異。 .NET框架不允許直接完成,但有一些庫可以爲此目的自動生成代理對象。給定一個接口和一個或多個對象,每個對象實現一些接口成員,並共同實現所有接口成員,代理生成器將創建(在運行時)一個新類,該類保存對提供對象的引用並實現該接口通過爲每個接口方法創建一個鏈接到其中一個傳入對象的相應方法的類方法。

請注意,雖然創建這些新類的方法是通用的,但類本身不會。可能是myProxyMaker.Create<IFoo>(IFlyingMammal)返回proxy8675309myProxyMaker.Create<ISwimmingMammal>返回proxy24601。因爲它們是完全不同的類別,所以IFlyingMammalISwimmingMammal有不同的成員這一事實將不構成問題。類可能有難看的機器生成名稱的事實並不重要,因爲不會聲明proxy8675309proxy24601類型的變量,而是類型IFlyingMammalISwimmingMammal

相關問題