Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在单个枚举常量上定义函数_C#_Interface_Enums_Class Design - Fatal编程技术网

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

C# 在单个枚举常量上定义函数,c#,interface,enums,class-design,C#,Interface,Enums,Class Design,我的一个类将enum作为其属性之一,该类的定义如下所示: public class A { string properrty1; int id; CustomEnum enum; public A() { //initialize the properties } } 因此,基于枚举类型,我需要该类调用一个函数,该函数将访问该类的某些属性并使用它执行操作 最好的方法是什么 我在考虑将接口作为类的属性之一,然后基于枚举在类的构造

我的一个类将enum作为其属性之一,该类的定义如下所示:

public class A
{

    string properrty1;
    int id;
    CustomEnum enum;

    public A()
    {
      //initialize the properties

    }

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

最好的方法是什么

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


这听起来是个好办法吗?如果是,您可以建议一种初始化接口的好方法,除了使用一组switch case语句来实例化该标记类型的接口的适当实现之外。

一个选项是使用
字典:


私有静态只读字典一个选项是拥有一个
字典


private static readonly Dictionary首先,switch
语句有什么问题?如果您所做的只是调用一个函数,只需在其中放入一个
开关
,并适当地调用它——不需要接口或其他任何东西。不要过度设计它


现在,如果您有充分的理由不使用这种方法,那么切换的另一种选择是使用
字典,其中T与您需要执行的操作相匹配。

首先,switch
语句有什么问题?如果您所做的只是调用一个函数,只需在其中放入一个
开关
,并适当地调用它——不需要接口或其他任何东西。不要过度设计它


现在,如果您有充分的理由不使用这种方法,那么切换的另一个替代方法是
字典
,其中T与您需要执行的操作相匹配。

那么,您是否尝试基于枚举值调用函数?那么,是否尝试基于枚举的值调用函数?还可以在运行时使用反射构建操作字典。这样可以消除一个可能被忽略的维护步骤。@Skizz:但同时引入了易出错的反射:)这是一种可能性,但我认为在做出决定之前,我需要查看用例(以及它发生的频率)。您还可以在运行时使用反射构建操作字典。这样可以消除一个可能被忽略的维护步骤。@Skizz:但同时引入了容易出错的反射:)这是一种可能性,但我认为在做出决定之前,我需要查看用例(以及它发生的频率)。
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);
}