2009-07-14 71 views
1

做特殊處理泛型類Pinnew成員的類型達恩·尼利19mins前做特殊處理的一種類型,泛型類

我試圖捲起一些舊的(原來.NET 1.1)抽象類進入泛型。所討論的類都爲特定類型的數據對象提供類似的功能。在大多數情況下,事情進展順利,但我遇到了幾個地方,其中一個數據對象是一種需要額外處理的類型,超出了所有其他類型的需要。我可以檢查T的類型以查看它是否是我需要執行特殊處理的類型,但從T到SpecialType的類型將不會編譯。有沒有不同的方式可以做到這一點,或者我想做什麼不可能?

class MyGenericClass : ICloneable where T: class, new() 
{ 

private T m_storedClass; 
... 

private DoStuff() 
{ 
    //do stuff for all types 

    //objects of SpecialType need extra stuff done. 
    if (typeof(T) == typeof(SpecialType)) 
    { 
     //compiler error: Error Cannot convert type 'T' to 'SpecialType' 
     ((SpecialType)m_storedClass).SpecialString = "foo"; 
    } 
} 

回答

2

怎麼是這樣的:

interface ISomething 
{ 
    void DoSomething(); 
} 

class NormalType : ISomething 
{ 
    // ... 
    public void DoSomething() { /* nothing to do */ } 
} 

class SpecialType : ISomething 
{ 
    // ... 
    public void DoSomething() { this.SpecialString = "foo" } 
} 

class MyGenericClass : ICloneable 
{ 
    private ISomething m_storedClass; 

    private DoStuff() 
    { 
     // ... 
     m_storedClass.DoSomething(); 
    } 
} 
+0

+1 - 這將是一個更好的方法來做到這一點。 – 2009-07-14 18:54:06

+0

+1 - 好多了。如果youi無法修改存儲的類,另一種方法是專門研究T和TSomething。 – 2009-07-14 18:57:58

+0

在不得不維護實現接口的獨立類的時候,我是否真的獲得了遺留的抽象/繼承類的方法? – 2009-07-14 19:18:31

0

除非你做這個

class MyGenericClass : ICloneable 
    where T: class, new(), SpecialType 

或本

class MyGenericClass : ICloneable 
    where T: class, new(), BaseTypeOfSpecialType 

或者也許這這是行不通的:

class MyGenericClass : ICloneable 
    where T: class, new(), InterfaceOnSpecialType 

也許你不需要做到這一點雖然 - 如果你發佈更完整的問題,也許我可以幫助你找出一種方法來避免必須這樣做。

0

你可以把它通過使用約束的工作,但是這個代碼有怪味它。

是否有另一種方法可以在不破壞班級的「通用性」的情況下獲得額外的處理?

0

它在C#中不起作用,編譯器不會讓你這樣做......如果你不能忍受其他人提出的接口/基類約束,我有一個不太好的但工作的解決方案:

您試圖執行的演員在C++/CLI中起作用。你必須自己決定是否值得。

3

以下編譯正常。

if (typeof(T) == typeof(SpecialClass)) 
{ 
    (this.m_storedClass as SpecialClass).SpecialOperation(); 
} 

鑄造到Object首先是另一種解決方案。

if (typeof(T) == typeof(SpecialClass)) 
{ 
    ((SpecialClass)((Object)this.m_storedClass)).SpecialOperation(); 
} 

只需注意,該檢查也可以重寫爲以下內容。

if (this.m_storedClass is SpecialClass) 
{ 
    (this.m_storedClass as SpecialClass).SpecialOperation(); 
} 

或者僅使用一個as運營商,包括免費條件的非空檢查。

SpecialClass special = this.m_storedClass as SpecialClass; 
if (special != null) 
{ 
    special.SpecialOperation(); 
}