gpt4 book ai didi

c# - 如何检查是否已调用静态构造函数?

转载 作者:太空狗 更新时间:2023-10-29 21:05:20 26 4
gpt4 key购买 nike

我有一些缓存数据库中数据的类,这些类在调用静态构造函数时加载数据。

我需要在所有这些类中调用静态 Reload 方法,但尚未初始化的类除外。

例如:城市缓存数据库中的数据

public class City
{
public City Get(string key)
{
City city;
FCities.TryGetValue(key, out city);
return city;
}
private static Dictionary<string, City> FCities;

static City()
{
LoadAllCitiesFromDatabase();
}

public static void Reload()
{
LoadAllCitiesFromDatabase();
}

private static void LoadAllCitiesFromDatabase()
{
// Reading all citynames from database (a very slow operation)
Dictionary<string, City> loadedCities = new Dictionary<string, City>();
...
FCities = loadedCities;
}
}

问题是 City 可能还没有被使用(它可能没有在这个服务中使用)并且没有理由从数据库加载它。

我的 reload all 方法看起来很像这样:

public static class ReloadAll
{
public static void Do()
{
foreach (Type classType in AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()).Where(t => t.IsClass && !t.IsAbstract))
{
MethodInfo staticReload = classType.GetMethods().FirstOrDefault(m => m.IsStatic && m.IsPublic && m.ReturnType == typeof(void) && m.Name == "Reload" && m.GetParameters().Length == 0);
if (staticReload != null)
{
if (StaticConstructorHasBeenCalled(classType))
staticReload.Invoke(null, null);
}
}
}

private bool StaticConstructorHasBeenCalled(Type classType)
{
// How do I check if static constructor has been called?
return true;
}
}

我需要一点帮助来实现 StaticConstructorHasBeenCalled。

最佳答案

乍一看,我认为这可能是一个问题 <grin>量子力学 哥本哈根解释 可能适用(“只要你看着它,它就会改变”)。 </grin> IE。您在类里面为观察它是否已初始化所做的任何操作都可能导致它自行初始化...

但是您不必在类中执行此操作,只需在其他地方(除了这些静态类中的任何一个)保留一个列表,每个静态类在初始化时都会填充该列表。然后在您的重置函数中,只需遍历列表中的类。

关于c# - 如何检查是否已调用静态构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14565009/

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