【问题标题】:Generic input parameters in C#?C#中的通用输入参数?
【发布时间】:2014-09-25 16:49:06
【问题描述】:

我正在尝试实现一个通用功能,假设我们有模式&它是相应的子模式

现在我所做的是为模式创建了一个枚举

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 作为第二个输入,请注意第二个输入(子模式)必须是基于第一个输入,

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

有什么想法吗?

【问题讨论】:

  • 他们必须是enum 类型吗?编辑:澄清一下,它们可以是具有一组固定成员的类(例如:stackoverflow.com/questions/2119714/…),还是可以是其他任何东西?
  • 您的 PerformOperation 方法最好将接口作为参数,然后对接口类型执行操作。这样您就不必在每次添加新操作时都添加到枚举中。
  • 枚举是理想的,因为用户在键入时可以看到相应的子模式。
  • @San':这纯粹是为了为使用您的代码的开发人员实现一些不错的智能感知/API 吗?您还有其他计划吗(例如序列化?)
  • 这听起来像多态行为,你应该使用实际多态而不是强制一些枚举开关。

标签: c# generics


【解决方案1】:

对于您的模式,您将无法使用 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, 

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

【讨论】:

  • 感谢Servy,有趣的一个,但不确定我是否理解这个。
  • @San' 你不明白什么?
  • 现在清楚了,我不明白的是PerformOperation()方法中的SubModesA参数,后来才知道是Enum。这与拥有三个方法非常相似,其中所有方法的第一个输入参数相同 (Modes),而第二个参数可以不同。
【解决方案2】:

以您当前的结构,这是不可能的。泛型类型约束在允许您约束的内容方面非常有限。实际上,您可以限制类 (new) 并强制从类或接口派生。

如果您将枚举 objects 和各种 SubModesA 派生自 ModeA,以及 ModeA 派生自 Mode,那么您可以这样做:

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

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

【讨论】:

  • 谢谢布拉德,我会试试这个方法。
猜你喜欢
  • 1970-01-01
  • 2016-05-10
  • 2011-12-28
  • 1970-01-01
  • 2015-04-10
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
相关资源
最近更新 更多