首页 / C# / C#强制静态字段初始化
C#强制静态字段初始化
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#强制静态字段初始化,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2529字,纯文字阅读大概需要4分钟。
内容图文
![C#强制静态字段初始化](/upload/InfoBanner/zyjiaocheng/788/36608b4b76b9400081beee75e7573b3c.jpg)
我们目前正在实现某种基于字符串的“可扩展枚举类”.下面仅显示此C#代码的一部分,以使问题更易于理解.
如果我运行下面的代码,它会将“BaseValue1”和“BaseValue2”写入控制台.
如果我取消注释RunClassConstructor行并运行代码,它还会将“DerivedValue1”和“DerivedValue2”写入控制台.
这是我想要实现的,但我想在没有RunClassConstructor行的情况下实现它.
我认为DerivedEnum.AllKeys将触发“DerivedValue1”和“DerivedValue2”的创建,但显然情况并非如此.
是否有可能实现我想要的,而不是强迫这些“枚举类”的用户编写一些魔术代码,或进行某种虚拟初始化?
using System;
using System.Collections.Generic;
namespace ConsoleApplication
{
public class Program
{
static void Main()
{
//System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(DerivedEnum).TypeHandle);
foreach (var value in DerivedEnum.AllKeys)
{
Console.WriteLine(value);
}
}
}
public class BaseEnum
{
private static readonly IDictionary<string, BaseEnum> _dictionary = new Dictionary<string, BaseEnum>();
public static ICollection<string> AllKeys
{
get
{
return _dictionary.Keys;
}
}
public static readonly BaseEnum BaseValue1 = new BaseEnum("BaseValue1");
public static readonly BaseEnum BaseValue2 = new BaseEnum("BaseValue2");
protected BaseEnum(string value)
{
_dictionary[value] = this;
}
}
public class DerivedEnum : BaseEnum
{
public static readonly DerivedEnum DerivedValue1 = new DerivedEnum("DerivedValue1");
public static readonly DerivedEnum DerivedValue2 = new DerivedEnum("DerivedValue2");
protected DerivedEnum(string value)
: base(value)
{
}
}
}
解决方法:
只有在首次访问类时才会调用静态构造函数.
虽然您确实使用过DerivedEnum.AllKeys,但它只是从BaseEnum继承而来.因此DerivedEnum从未被直接引用.
您可以做的一点是,实际上在DerivedEnum上创建一个新的静态属性,它从基类返回相同的属性,因此在调用它时,将调用派生类的静态构造函数.
public class DerivedEnum : BaseEnum
{
public new static ICollection<string> AllKeys
{
get
{
return BaseEnum.AllKeys;
}
}
}
UPDATE
您还可以使用System.Reflexion动态调用它们:
public class BaseEnum
static BaseEnum()
{
// from the types defined in current assembly
Assembly.GetExecutingAssembly().DefinedTypes
// for those who are BaseEnum or its derived
.Where(x => typeof(BaseEnum).IsAssignableFrom(x))
// invoke their static ctor
.ToList().ForEach(x => System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(x.TypeHandle));
}
}
您还可以使用此代码初始化其他程序集中定义的派生类:
AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(x => x.DefinedTypes)
.Where(x => typeof(BaseEnum).IsAssignableFrom(x))
.ToList().ForEach(x => System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(x.TypeHandle));
内容总结
以上是互联网集市为您收集整理的C#强制静态字段初始化全部内容,希望文章能够帮你解决C#强制静态字段初始化所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。