2014-09-25 58 views
1

我試圖實現一個通用的功能,比方說,我們有它相應的子模式 模式& enter image description hereC#中的通用輸入參數?

現在我已經做了我創建了一個枚舉的模式

public enum Modes 
{ 
    ModeA, 
    ModeB, 
    ModeC 
} 

和同樣,對於子模式,

public enum SubModesA 
{ 
    SubModeA1, 
    SubModeA2, 
    SubModeA3 
} 

public enum SubModesB 
{ 
    SubModeB1, 
    SubModeB2 
} 

public enum SubModesC 
{ 
    SubModeC1, 
    SubModeC2, 
    SubModeC3 
} 

現在的問題是,如何實現一個方法(也可以是一般的),這需要在Mode爲一體,在將Sub Modes作爲第二個輸入,請注意第二個輸入(子模式)必須基於第一個輸入,

(Ex。 Public void PerformOperation(Modes mode, SubModes subMode){};

有什麼想法嗎?

+0

他們必須是'enum'類型嗎?編輯:只是爲了澄清,他們可以成爲一組固定的成員類(像這裏:http://stackoverflow.com/questions/2119714/when-to-use-enums-and-when-to-replace-them-與類與靜態成員),或者他們可以是其他任何東西? – 2014-09-25 16:51:37

+0

您的PerformOperation方法可以更好地將接口作爲參數,然後對接口類型執行操作。這樣,每次添加新操作時都不必添加到枚舉中。 – 2014-09-25 16:52:09

+0

枚舉將是理想的,因爲用戶在鍵入內容時可以看到相應的子模式。 – SanVEE 2014-09-25 16:52:49

回答

3

對於您的模式,您將無法使用enum獲得此行爲。您需要使用一種機制,其中涉及每種模式的不同類型,以便每種模式都可映射到方法的不同重載。你可以使用一個類像這樣來實現這一目標:

public class Mode 
{ 
    public static readonly ModeA ModeA = new ModeA(); 
    public static readonly ModeB ModeA = new ModeB(); 
    public static readonly ModeC ModeA = new ModeC(); 
    public class ModeA { } 
    public class ModeB { } 
    public class ModeC { } 
} 

現在,您可以編寫方法,比如這個:

public static void PerformOperation(Mode.ModeA mode, SubModesA subMode) 
{ 

} 

您可以爲每種類型的方式方法,每個都具有相應的子模式。這意味着呼叫者現在可以寫入:

PerformOperation(Mode.ModeA, 

並且第二個參數的唯一有效值是相應子模式的實例。

+0

謝謝Servy,有趣的但不知道如果我理解這一個。 – SanVEE 2014-09-25 17:03:49

+0

@San'你不明白什麼? – Servy 2014-09-25 17:06:59

+0

現在很清楚,我不明白的是'PerformOperation()'方法中的'SubModesA'參數,後來我意識到它是Enum。這與使用三種方法非常相似,第一個輸入參數對於所有方法來說都是相同的('Modes'),而第二個參數可以不同。 – SanVEE 2014-09-26 09:16:31

2

隨着你目前的結構,這是不可能的。通用類型約束在它們允許你約束的地方非常有限。實際上,您可以限制爲類(new)並強制從類或接口派生。

如果進行對象ModeA衍生的各種SubModesAModeA的枚舉從Mode派生,那麼你可以這樣做:

public class MyGenericClass<T,U> where T : Mode 
           where U : T 

你可能要考慮一些其他模式(模板方法,想到戰略)來處理這種情況。

+0

感謝Brad,我會嘗試這種方法。 – SanVEE 2014-09-25 16:59:23