gpt4 book ai didi

c# - 为什么我的静态构造函数没有被调用

转载 作者:行者123 更新时间:2023-12-02 11:18:52 25 4
gpt4 key购买 nike

我有两个类试图用来实现字符串枚举模式。问题是当调用父类的运算符时,不会调用子类的静态构造函数。有没有一种方法可以解决这个问题,而无需在代码中添加 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" 之类的操作时,它会失败,因为静态构造函数尚未触发。我觉得它应该触发,因为我使用的是静态运算符。

最佳答案

一旦满足以下条件之一,就会调用某个类的静态构造函数:

  1. 创建类的实例;
  2. 访问类的任何静态字段。

由于您既不创建 UseTimeStringEnum 的实例,也不访问代码中的静态字段,因此不会调用静态构造函数。

所以重点是:BaseStringEnum 在编译时不知道 UseTimeStringEnum。

我看到唯一正确的解决方案 - 我们可以在运行时引用 UseTimeStringEnum。

我向 BaseStringEnum 类添加了静态构造函数,该类通过反射加载并观察所有可用的子类。

现在调用静态构造函数。

编辑:Mykroft 指出有一种方法可以直接调用静态构造函数,而不是通过反射引用静态字段。所以我相信最终的代码片段应该是

static BaseStringEnum()
{
var StringEnumTypes = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes())
.Where(type => type.IsSubclassOf(typeof(BaseStringEnum<T>)));

foreach (var type in StringEnumTypes) type.TypeInitializer.Invoke(null, null);
}

关于c# - 为什么我的静态构造函数没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25903430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com