在单个枚举常量上定义函数

时间:2011-09-15 08:51:20

标签: c# interface enums class-design

我的一个类将枚举作为其属性之一,并且类的定义如下所示:

public class A
{

    string properrty1;
    int id;
    CustomEnum enum;

    public A()
    {
      //initialize the properties

    }

}

因此,基于枚举类型,我需要这个类来调用一个函数,该函数将访问类的某些属性并使用它执行操作。

最好的方法是什么?

我在考虑将接口作为类的一个属性,然后基于枚举在类的构造函数中实例化接口,并且在需要时我可以执行classObject.interface.interfaceImplementation();

这听起来像是一种好方法吗?如果是,你可以建议一个初始化接口的好方法,除了使用一堆switch case语句,它将实例化该标签类型的接口的适当实现。

2 个答案:

答案 0 :(得分:2)

一种选择是拥有Dictionary<CustomEnum, Action>

private static readonly Dictionary<CustomEnum, Action<A>> Actions =
{
    { CustomEnum.Foo, FooAction },
    { CustomEnum.Bar, BarAction },
    { CustomEnum.Baz, BazAction },
};

private static void FooAction(A a) { ... }
private static void BarAction(A a) { ... }
private static void BazAction(A a) { ... }

public void DoSomething()
{
    Actions[enumValue](this);
}

这实际上取决于这些函数的意图,等等。如果动作本身就是枚举本身,你可能想要创建一个“智能枚举”,它基本上是一组固定的值,但它是一个带有行为的 class 。这有点像Java枚举,但C#作为一种语言并没有太多的支持。

有关此示例,请参阅DateTimeFieldType in Noda Time。那只有属性,它可以很容易地有方法,并且它们可以是抽象的,其中嵌套了具体的私有子类 - 有点像ZoneLocalMapping,也在Noda Time中 - 但在那种情况下它是一个有三种不同实现的工厂,而不是三个特定的值。

答案 1 :(得分:2)

首先,switch语句出了什么问题?如果您只是调用 a 函数,只需在其中放置一个switch并适当调用它 - 不需要接口或其他任何东西。不要过度工程化。

现在,如果您有充分的理由不采用这种方法,那么切换的另一种选择是Dictionary<CustomEnum, T>,其中T是适合您需要做的事情。