2011-10-13 72 views
0

我認爲很多C#開發人員碰到這樣的問題:在標準的.net庫和許多標準類以及它們的方法中都有一些枚舉。但是如果你想通過添加一些不可能的字段來擴展這個枚舉,但它可以有效地簡化開發過程並且不會干擾那些標準類的工作。我通過具體的例子來描述它: System.Diagnostics命名空間中有一個枚舉TraceOptions,它由TraceListeners使用。讓我們來設計一些額外選項的Listener(比如AssemblyName等)。現在我必須創建新的枚舉,其中包含所有額外的選項,這些選項補充了TraceOptions枚舉中的選項。然後將新的屬性ExtraTraceOptions添加到我的偵聽器。但如果我能寫這樣的事:爲什麼在C#中不存在枚舉擴展?

enum MyExtraEnum : TraceOptions 
{ 
    AssemblyName = 128 
} 

MyExtraEnum將被新的領域,它不能與跟蹤選項的領域也由名交叉,也不是價值延伸跟蹤選項。然後,我可以使用跟蹤選項與新的領域,如:

 TraceOptions t = TraceOptions.AssemblyName; (IntelliSense may display that this 
field is extended field from MyExtraEnum enumeration) 

我明白,這可能會破壞現有的代碼使用跟蹤選項枚舉,但如果我相信它不會發生,所有的責任心使用這種功能是躺在我。

你對這樣的表現有什麼看法?

+1

這有點不符合枚舉的目的。 – BoltClock

回答

0

你不能從一個枚舉繼承,所有的枚舉都是隱式密封的。所以沒有簡單的方法給枚舉添加一個額外的值(如果這是你想要做的)。你將不得不定義一個新的枚舉。

如果你想添加額外的方法給一個枚舉,你可以使用擴展方法,但這是你可以擴展它們的唯一方法。

3

這聽起來對我來說不是一個好主意。所以現在C#6已經出來了,TraceOptions有一個新功能:SomeFoo = 128。或者可能是AssemblyName = 127。現在你有一個碰撞,這與TraceOptions的供應商(不像普通的子類)不一樣。

枚舉提供了一組有限的選項,枚舉的作者支持。說明你承擔全部責任是不夠的。這就像要求所有成員變量將公開一樣,說明你永遠不會濫用它們。這只是一種安全的編程方法。

+0

但是,這可能發生在所有擴展方法上,而不僅僅是在枚舉上...... –

+0

@JoanCharmant,好點,但在值部分仍然有很大的不同。如果枚舉使用值1-9,則值10可能會被擴展和下一個版本的枚舉使用。名稱衝突的可能性要低得多,這是擴展方法的唯一問題。 – eran