【发布时间】:2014-09-18 02:52:29
【问题描述】:
我尝试使用两个类来实现字符串枚举模式。问题是当调用父类的运算符时,子类的静态构造函数没有被调用。有没有一种方法可以解决这个问题,而无需在代码中添加 hack 来初始化静态成员?
public abstract class BaseStringEnum<T> where T : BaseStringEnum<T>
{
public string Value { get; private set; }
private static List<T> _values = null;
protected static List<T> Values
{
get
{
if (_values == null)
{
_values = new List<T>();
}
return _values;
}
}
protected BaseStringEnum(string value, string resId)
{
Value = value;
ResourceId = resId;
Values.Add((T)this);
}
public static implicit operator string(BaseStringEnum<T> value)
{
return value.Value;
}
public static implicit operator BaseStringEnum<T>(string value)
{
return Values.Where(v => v.Value.Trim() == value.Trim()).First();
}
}
public sealed class UseTimeStringEnum : BaseStringEnum<UseTimeStringEnum>
{
private UseTimeStringEnum(string value, string resourceId) : base(value, resourceId) { }
public static readonly UseTimeStringEnum None;// = new UseTimeStringEnum("N", "None");
public static readonly UseTimeStringEnum Required;// = new UseTimeStringEnum("R", "Required");
public static readonly UseTimeStringEnum Optional;// = new UseTimeStringEnum("O", "Optional");
static UseTimeStringEnum()
{
None = new UseTimeStringEnum("N", "None");
Required = new UseTimeStringEnum("R", "Required");
Optional = new UseTimeStringEnum("O", "Optional");
}
}
问题是当代码尝试执行(UseTimeStringEnum)"R" 之类的操作时,它会失败,因为静态构造函数尚未触发。我觉得它应该触发,因为我使用的是静态运算符。
【问题讨论】:
-
父类不知道子类中的静态构造函数,这就是为什么引用父类时不调用构造函数的原因。即使您将类更改为结构,也不会产生影响。
-
“失败”是什么意思?
-
我在这里只看到基类和子类。为什么这是一个关于嵌套类的问题的欺骗?
-
另外说明;这是字符串枚举的正确方法吗?
-
@PeterRitchie 当我说“失败”时,我的意思是没有达到我的预期。在这种情况下,由于构造函数尚未触发,因此列表为空。这会导致在
First调用上引发异常。