【发布时间】:2014-08-25 16:24:07
【问题描述】:
我有一系列静态类,用于获取枚举值的字符串。它们看起来都像这样:
public static class MyEnumToString
{
private static Dictionary<MyEnum, string> map
= new Dictionary<MyEnum, string>();
public static string Get(MyEnum type)
{
PopulateEmptyMap();
return map[type];
}
static void PopulateEmptyMap()
{
if (!map.Any())
{
PopulateMap();
}
}
private static void PopulateMap()
{
map[MyEnum.enum1] = "string for enum 1";
map[MyEnum.enum2] = "string for enum 2";
}
}
我有多个这样的类,它们使用的 Enum 类型和字符串值不同。显然,我应该结合这些类来减少重复代码。
我尝试做的是创建通用基类,以便它可以处理任何类型,然后为继承的类实现 PopulateMap。如果可能的话,它看起来像这样:
public static class TypeToString<TType>
{
public static Dictionary<TType, string> map
= new Dictionary<TType, string>();
public static string Get(TType type)
{
PopulateEmptyMap();
return map[type];
}
static void PopulateEmptyMap()
{
if (!map.Any())
{
PopulateMap();
}
}
public abstract static void PopulateMap();
}
public static class MyEnumToString: TypeToString<MyEnum>
{
public static void PopulateMap()
{
map[MyEnum.enum1] = "string for enum 1";
map[MyEnum.enum2] = "string for enum 2";
}
}
我不得不公开 Dictionary 和 PopulateMap 方法,因为显然泛型类不能有受保护或受保护的内部成员。必须公开这一点并不理想,但也不会破坏交易。
我最关心的是“可覆盖的方法不能是静态的”,所以我的 PopulateMap 方法不能既是抽象的又是静态的。如果它不是静态的,则不能从其他静态方法中调用它。如果它不是抽象的,那么继承类的 PopulateMap 就不会被调用。
这个版本甚至没有构建。
有什么方法可以做我想做的事情并且仍然保持我的班级静态吗?我真的很想避免每次我想调用 TypeToString.Get() 时都必须实例化一个 TypeToString 对象。
【问题讨论】:
-
提示:为什么不为枚举创建属性创建从属性中提取字符串的扩展方法?
-
您可以让静态代码在模板本地创建一个非静态类的实例,然后该实例包含您的所有虚函数,并让静态类通过该模板的单个实例路由所有内容处理程序类。您还应该能够参数化重载函数而不是使其成为虚拟函数。即:有
MyEnumToString<X> when X: Enum1,一个when X: Eum2,等等
标签: c#