我有一些从数据库缓存数据的类,这些类在静态构造函数被调用时加载数据。
我需要调用所有这些类的静态Reload方法,除了那些尚未初始化的类。
例如:City从数据库缓存数据。
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(它可能不在此服务中使用),因此没有理由从数据库加载它。
我的重新加载所有方法看起来很像这样:
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的实现方面的帮助。
Lazy(T)
中,并使用IsValueConstructed
在Reload
方法内部进行检查。 - Damien_The_Unbeliever