2014-09-25 55 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