据我所知,类中的静态对象是在类第一次被引用时构造的。但是我发现有时在程序启动时初始化静态变量很有用。是否有某种方法(即通过使用注释)来强制执行它?
最佳答案
你不能用属性来做(没有额外的代码),但你可以用反射强制类型初始化。
例如:
foreach (Type type in assembly.GetTypes())
{
ConstructorInfo ci = type.TypeInitializer;
if (ci != null)
{
ci.Invoke(null);
}
}
请注意,这不会调用泛型类型的类型初始值设定项,因为您需要指定类型参数。您还应该注意,它会强制运行类型初始值设定项即使它已经运行,这与正常体验背道而驰。我建议,如果您真的需要这样做(并且我会尝试更改您的设计,以便您尽可能不需要它),您应该创建自己的属性,并将代码更改为像这样的东西:
foreach (Type type in assembly.GetTypes())
{
if (type.GetCustomAttributes(typeof(..., false)).Length == 0)
{
continue;
}
ConstructorInfo ci = type.TypeInitializer;
if (ci != null)
{
ci.Invoke(null, null);
}
}
诚然,您可以使用 LINQ 做到这一点:
var initializers = from type in assembly.GetTypes()
let initializer = type.TypeInitializer
where initializer != null &&
type.GetCustomAttributes(typeof(..., false).Length > 0
select initializer;
foreach (ConstructorInfo initializer in initializers)
{
initializer.Invoke(null, null);
}
关于c# - 强制构建静态对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1979008/