C#中的通用输入参数?

时间:2014-09-25 16:49:07

标签: c# generics

我试图实现通用功能,让我们说我们有Modes&它对应的子模式 enter image description here

现在我所做的就是我创建了一个Enum for Modes

public enum Modes
{
    ModeA,
    ModeB,
    ModeC
}

,类似于SubModes,

public enum SubModesA
{
    SubModeA1,
    SubModeA2,
    SubModeA3
}

public enum SubModesB
{
    SubModeB1,
    SubModeB2
}

public enum SubModesC
{
    SubModeC1,
    SubModeC2,
    SubModeC3
}

现在我的问题是,如何实现一个方法(它可能是通用的),它将Mode作为一个输入,Sub Modes作为第二个输入,请注意第二个输入(子模式) )必须基于第一次输入,

(例如Public void PerformOperation(Modes mode, SubModes subMode){};

请问任何想法?

2 个答案:

答案 0 :(得分: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, 

并且第二个参数的唯一有效值是相应子模式的实例。

答案 1 :(得分:2)

使用您当前的结构,这是不可能的。它们允许您约束的通用类型约束非常有限。实际上,您可以限制类(new)并从类或接口强制派生。

如果您创建了枚举对象,并且从SubModesA派生了各种ModeA,并且ModeA派生自Mode,那么您可以执行以下操作:

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

为了处理这种情况,您可能需要考虑其他一些模式(模板方法,策略)。