我试图实现通用功能,让我们说我们有Modes&它对应的子模式
现在我所做的就是我创建了一个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){};
请问任何想法?
答案 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
为了处理这种情况,您可能需要考虑其他一些模式(模板方法,策略)。