枚举vs C#中的字典用法

时间:2017-08-09 18:49:05

标签: c# dictionary enums

我正在开发一个名为" GenericReceiver"的抽象类。包含名为"状态的枚举。"它包含接收器的故障代码,如下所示:

public enum Status
    {
        Fault1 = 0x0,                  // 00
        Fault2 = 0x201,                // 513
        //etc

这些故障代码在接收器中没有标准化(尽管有些是共享的),因此我无法使整个枚举成为抽象类的成员。但是有很多故障代码,我希望尽可能减少代码重复。

我考虑使用字典而继承共享的错误代码。然后我会添加剩余的故障代码。出现的问题是故障代码不应该在运行时更改,因此最初的枚举实现。

有没有办法连接两个枚举或将字典转换为枚举?

2 个答案:

答案 0 :(得分:1)

还有另一种选择。虽然您无法派生枚举,但您可以简单地在派生类中重复该名称,并首先将所有值设置为与基类中的值相同。例如:

public abstract class GenericReceiver
{
    public enum Status
    {
        Fault1 = 0x0,
        Fault2 = 0x201
    }
}
public class DerivedReceiver
{
    public enum Status
    {
        Fault1 = GenericReceiver.Status.Fault1,
        Fault2 = GenericReceiver.Status.Fault2,
        Fault3 = 0x302
    }
}

这有利于成为编译时解决方案,但是需要你有一些机制来测试派生类枚举总是实现抽象基类枚举中的所有值(单元测试??),以防万一稍后在抽象类中添加代码。虽然你可能不喜欢它在代码重复的基础上,我想我还是建议它!

答案 1 :(得分:0)

必须在编译时创建枚举。之后你不能改变它们。

您最好的选择是实施ReadOnlyDictionary。当然,你不能在创建之后改变它们,所以你的继承会有点复杂。

我将如何做到这一点:

public abstract BaseCodes
{
    protected ReadOnlyDictionary<int, string> CommonCodes = new ReadOnlyDictionary<int, string>
    {
        {0, "Fault1"},
        {513, "Fault2"}
    };
}

public class DerivedCodes1 : BaseCodes
{
    public DerivedCodes1() 
    {
        // Get a writable copy of the common codes
        var codes = CommonCodes.ToDictionary();
        codes.Add(404, "Not Found");
        codes.Add(42, "Life, the Universe, and Everything");

        Codes = new ReadOnlyDictionary<int, string>(codes);            
    }

    public ReadOnlyDictionary<int, string> Codes;
}

这不是世界上最干净的,但由于你不能从枚举中继承,这将为你的问题提供最佳答案。