如何确保多个枚举的唯一性?

时间:2014-02-04 17:02:42

标签: c# .net enums

我正在为我的应用程序实现缓存架构。我不是要成为枚举驱动值的键,而不是传递来自不同模块的键。这将让我在一个地方管理我的所有缓存调用(因为枚举中指定的所有内容都被缓存)。

我的枚举定义如下:

public enum ActionsTypeAEnum { SomthingFromACache, SomethingElseFromACache }
public enum ActionsTypeBEnum { SomthingFromBCache, SomethingElseFromBCache }

现在我已经定义了一个CacheManager util类,它有GetCachedData,InsertCacheData等方法......

我有几个问题:

  1. 如何确保枚举值在多个枚举中是唯一的?

  2. 在我的InsertCacheData中,我想只有一个方法接受来自任何已定义枚举的值,而不是为此定义了多个重载方法(因为C#不提供Enum继承,我不能使用'base'类型枚举作为方法参数)

  3. 我还能如何构建我的代码以实现上述任务?

2 个答案:

答案 0 :(得分:3)

你只是超越了枚举的功能。可能是时候开始创建自定义类,只是模拟您正在寻找的枚举行为:

public abstract class CacheAction
{
    //so it can't be inherited from elsewhere
    private  CacheAction() { }

    public class TypeA : CacheAction
    {
        private TypeA() { }
        public static readonly TypeA SomthingFromACache = new TypeA();
        public static readonly TypeA SomethingElseFromACache = new TypeA();
    }
    public class TypeB : CacheAction
    {
        private TypeB() { }
        public static readonly TypeB SomthingFromBCache = new TypeB();
        public static readonly TypeB SomethingElseFromBCache = new TypeB();
    }
}

这允许您编写方法:

public static void Foo(CacheAction action)
{
    if (action == CacheAction.TypeA.SomthingFromACache) { }
    else if (action == CacheAction.TypeA.SomethingElseFromACache) { }
    else if (action == CacheAction.TypeB.SomthingFromBCache) { }
    else if (action == CacheAction.TypeB.SomethingElseFromBCache) { }
    //this will only be hit by null unless you omit an option above
    else throw new ArgumentException("Invalid action provided");
}

请注意,如果它对您有所帮助,您实际上可以在每个操作中存储一些状态。您可以根据构造函数中设置的某些信息为CacheAction提供只读属性,然后让每个固定实例在创建时设置一些数据。它可以是一个整数,你确保它是唯一的,它可以是一些字符串,Action表示要做什么,或者其他什么。通过确保它通过基类公开,你实际上允许像Foo这样的方法利用多态,而不需要检查每种类型。

答案 1 :(得分:1)

您可以定义父枚举并使用它来设置“子”枚举中的值。

public enum ParentEnum
{
    A1 = 1, A2 = 2,
    B1 = 100, B2 = 101
}

public enum AEnum
{
    A1 = ParentEnum.A1,
    A2 = ParentEnum.A2
}

和B类似。我已经成功地使用这种技术来扩展枚举。