你不能用属性(没有额外的代码)来做,但你可以用反射强制类型初始化.
例如:
foreach (Type type in assembly.GetTypes())
{
ConstructorInfo ci = type.TypeInitializer;
if (ci != null)
{
ci.Invoke(null);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这不会为泛型类型调用类型初始值设定项,因为您需要指定类型参数.您还应该注意,它将强制运行类型初始化程序,即使它已经运行过,面对正常体验也是如此.我建议如果你真的需要这样做(我会尝试改变你的设计,如果可能你不需要它)你应该创建自己的属性,并将代码改为:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
你可以用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);
}
Run Code Online (Sandbox Code Playgroud)