В настоящее время мы реализуем какой-то «расширяемый класс enum» на основе строк. Ниже приведена только часть этого кода C#, чтобы облегчить понимание проблемы.Инициализация статических полей C#
Если я запустил код ниже, он записывает «BaseValue1» и «BaseValue2» на консоль.
Если я раскомментирую строку RunClassConstructor и запустил код, он дополнительно записывает «DerivedValue1» и «DerivedValue2» на консоль.
Этого я хочу достичь, но я хочу его достичь безRunClassConstructor линия.
Я думал, что DerivedEnum.AllKeys вызовет создание «DerivedValue1» и «DerivedValue2», но, очевидно, это не так.
Есть ли возможность достичь того, чего я хочу, не заставляя пользователя этих «классов enum» писать какой-то магический код или делать какую-то фиктивную инициализацию?
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)
{
}
}
}
[Когда статические переменные инициализируются в C#?] (Http: // stackoverflow.com/questions/3965976/when-do-static-variables-get-initialized-in-c), [Есть ли способ принудительно инициализировать статические поля в C#?] (http://stackoverflow.com/questions/ 2154697/is-there-a-way-to-force-static-fields-to-be-initial-in-c), поэтому вам нужно _instantiate_ 'DerivedEnum' или получить доступ к одному из статических членов _its_. – CodeCaster