我的一个类将枚举作为其属性之一,并且类的定义如下所示:
public class A
{
string properrty1;
int id;
CustomEnum enum;
public A()
{
//initialize the properties
}
}
因此,基于枚举类型,我需要这个类来调用一个函数,该函数将访问类的某些属性并使用它执行操作。
最好的方法是什么?
我在考虑将接口作为类的一个属性,然后基于枚举在类的构造函数中实例化接口,并且在需要时我可以执行classObject.interface.interfaceImplementation();
这听起来像是一种好方法吗?如果是,你可以建议一个初始化接口的好方法,除了使用一堆switch case语句,它将实例化该标签类型的接口的适当实现。
答案 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是适合您需要做的事情。