3

名前空間グローバル内に次のクラスを作成しました

namespace Global
{
    public static class Status
    {
        public static readonly char Active;
        public static readonly char Suspended;
        public static readonly char Terminiated;
        public static readonly char Deleted;

        private static readonly Dictionary<char, string> statusCollection;
        public static Dictionary<char, string> StatusCollection 
        { 
            get 
            { 
                return statusCollection; 
            }
        }

        static Status()
        {
            statusCollection = new Dictionary<char, string>();
            statusCollection.Add('A', "Active");
            statusCollection.Add('S', "Suspended");
            statusCollection.Add('T', "Terminated");
            statusCollection.Add('D', "Deleted");

            Active = 'A';
            Suspended = 'S';
            Terminiated = 'T';
            Deleted = 'D';
        }
    }

    public class a
    {
        public void add()
        {
            //How to make this collection readonly
            Status.StatusCollection.Add('N', "asd"); 

            Status.Active = 'M'; //Throws a compile time exception, changes not allowed
        }
    }
}

奇妙な動作即時ウィンドウで更新しようとしたときStatus.Active、値が変更されないことを期待していましたが、変更が許可されました。readonlyリフレクションまたはランタイムを介して変数の値を変更できるということですか?

4

1 に答える 1

5

readonlyはい、 Reflection を使用して実行時にプロパティの値を変更できます。そして、これは非常に単純な POC です。

public class Program
{
    private static readonly string Foo = "Bar";

    static void Main()
    {
        typeof(Program)
            .GetField("Foo", BindingFlags.Static | BindingFlags.NonPublic)
            .SetValue(null, "new value");
        Console.WriteLine(Foo);
    }
}

このコンソール アプリケーションを実行すると、次のように出力されます。

new value
于 2012-06-30T18:21:57.660 に答える