我正在为我的应用程序实现缓存架构。我不是要成为枚举驱动值的键,而不是传递来自不同模块的键。这将让我在一个地方管理我的所有缓存调用(因为枚举中指定的所有内容都被缓存)。
我的枚举定义如下:
public enum ActionsTypeAEnum { SomthingFromACache, SomethingElseFromACache }
public enum ActionsTypeBEnum { SomthingFromBCache, SomethingElseFromBCache }
现在我已经定义了一个CacheManager
util类,它有GetCachedData,InsertCacheData等方法......
我有几个问题:
如何确保枚举值在多个枚举中是唯一的?
在我的InsertCacheData中,我想只有一个方法接受来自任何已定义枚举的值,而不是为此定义了多个重载方法(因为C#不提供Enum继承,我不能使用'base'类型枚举作为方法参数)
我还能如何构建我的代码以实现上述任务?
答案 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类似。我已经成功地使用这种技术来扩展枚举。