static プロパティを初期化したい


抽象クラス `Super` を継承した `Sub` クラスがあります。  
`Sub.All` プロパティで `Sub.One` と `Sub.Two` のインスタンスを取得したいです。

[code]

    abstract class Super<T> where T : Super<T>
    {
        private readonly int value;
        private static List<T> list = new List<T>();
    
        public static List<T> All { get { return list; } }
    
        protected Super(int value)
        {
            this.value = value;
            list.Add((T)this);
        }
    }
    
    class Sub : Super<Sub>
    {
        public static Sub One = new Sub(1);
        public static Sub Two = new Sub(2);
    
        private Sub(int value)
            : base(value)
        {
        }
    }
    
[/code]

次のようにすれば `Sub` の静的コンストラクタが実行されるので、実現できることは理解しています。1 行目がない場合でも実現できる方法が知りたいです。

[code]

    var instance = Sub.One; // これがなくても実現してほしい
    var all = Sub.All; // Sub.One と Sub.Two のインスタンスが格納されていてほしい
    
[/code]




>
[code]

>     var all = Sub.All; // Sub.One と Sub.Two のインスタンスが格納されていてほしい
>  
[/code]

ソースコード上は`Sub.All`と記述していますが、実体としては`Super<Sub>.All`であり、コンパイル時にそのように解釈されます。そのため、`Sub`静的コンストラクターが実行される理由が存在しません。

やや強引となりますが、`Super`静的コンストラクター内で強制的に`Sub`静的コンストラクターを呼び出すことでしょうか。

[code]

    static Super() {
        System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(T).TypeHandle);
    }
    
[/code]




>
[code]

>     var all = Sub.All; // Sub.One と Sub.Two のインスタンスが格納されていてほしい
>  
[/code]

ソースコード上は`Sub.All`と記述していますが、実体としては`Super<Sub>.All`であり、コンパイル時にそのように解釈されます。そのため、`Sub`静的コンストラクターが実行される理由が存在しません。

やや強引となりますが、`Super`静的コンストラクター内で強制的に`Sub`静的コンストラクターを呼び出すことでしょうか。

[code]

    static Super() {
        System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(T).TypeHandle);
    }
    
[/code]

