2010-07-05 105 views
4

我有一個自定義類「錯誤」和一些預先創建的錯誤(讓我們稱他們爲A,B和C)。現在我很想組這些預先創建者在一個組(例如,「StockErrors」),並像一個枚舉使用它們種:像枚舉,但對象

private void SomeFunction(Error NewError) 
{ 
    if (NewError == StockErrors.A) DoSomething(); // this is what I need. 
} 

任何想法如何,我可以做到這一點?這可能是一個非常簡單的...

在此先感謝!

+0

哇,你們真是太棒了!完美工作:) – 2010-07-05 23:02:57

回答

4

製作staticStockErrorspublic static readonly類型Error已初始化爲適當的值。 (您也可以使用屬性)

根據您的Error類,你可能還需要重寫==!=EqualsGetHashCode使用值語義。

+0

替代重寫相等比較,可以使所有構造函數都是私有的,並僅通過靜態屬性將單個實例公開爲單例,然後依賴對象標識。 – 2010-07-05 22:50:39

+0

@丹尼爾:他說了很多值。 – SLaks 2010-07-05 22:51:24

+0

單例不是絕對正確的術語 - 我的意思是每個特定錯誤一個實例。 – 2010-07-05 22:53:47

1

事情是這樣的:

public static class StockErrors 
{ 
    public static readonly Error A = new Error("A"); 
    public static readonly Error B = new Error("B"); 
    public static readonly Error C = new Error("B"); 
} 

這就是最簡單的死亡聲明,但它暴露了場,這通常被認爲是不好的形式。爲了讓它更容易被接受,你可以聲明這些字段爲private,然後將它們暴露在public static屬性中。另外,如果你的Error類不能單獨建立在常量值的基礎上,那麼你需要在靜態構造函數中初始化變量。下面是一個示例,其中的值由屬性公開,並在靜態構造函數中初始化:

public static class StockErrors 
{ 
    private static readonly Error a; 
    private static readonly Error b; 
    private static readonly Error c; 

    public static Error A { get { return a; } } 
    public static Error B { get { return b; } } 
    public static Error C { get { return c; } } 

    static StockErrors() 
    { 
     a = new Error(...); 
     b = new Error(...); 
     c = new Error(...); 
    } 
}