2013-03-31 11 views
18
class Bla 
{ 
    public readonly int sum; 
} 

FieldInfo f = type.GetField("sum"); 
f.?? // what? 

sumが読み取り専用かどうかを確認するにはどうすればよいですか?プロパティの場合、メンバーに書き込みアクセス権があるかどうかを調べるためにPropertyInfo.CanWriteを実行できます。メンバ変数が読み込み専用かどうかを調べる方法は?

答えて

29

readonlyは、フィールドの宣言の近くまたはコンストラクタ内でのみフィールドの割り当てが行われることを意味します。だから、

はフィールドのみ

詳細はIsInitOnly MSDN article

FieldInfo f = typeof(Bla).GetField("sum"); 
Console.WriteLine(f.IsInitOnly); //return true 
上にあるコンストラクタの本体で設定することができるかどうかを示す値を取得 FieldInfoIsInitOnlyプロパティを、使用することができます

注:IsLiteralプロパティを使用して、フィールドがコンパイル時定数であるかどうかをテストすることもできます。 readonlyフィールドの場合はfalseを返しますが、constのフィールドの場合はtrueです。

もう1つの注意:反射によってreadonlyフィールドとprivateフィールドに書き込むことが妨げられることはありません(public readonlyでも同じですが、より限定されたケースを示したいと思います)。だから、次のコード例は有効で、任意の例外をスローしません:あなたは、フィールドを取得し、それに値を書き込む場合は理由GetFieldウォン」

class Bla 
{ 
    //note field is private now 
    private readonly int sum = 0; 
} 

は今、(私は、民間の非静的フィールドを取得するためにBindingFlagsを使用しますデフォルトでは、プライベートフィールドのtリターンFieldInfo

FieldInfo field = typeof(Bla).GetField("sum", BindingFlags.NonPublic | 
               BindingFlags.Instance); 

var bla = new Bla(); 
field.SetValue(bla, 42); 

Console.WriteLine(field.GetValue(bla)); //prints 42 

すべてがOKに動作します。フィールドがconstの場合にのみ例外がスローされます。

+0

'NonPublic'フラグがここでやっている任意のアイデアが含まれている必要がありますか? – nawfal

+0

@nawfal 'GetField'はデフォルトでプライベートフィールドを返しません。あなたは明示的にこれを設定する必要があります –

+0

@ああ私はそれを得る。私はあなたの例を気にしていませんでした。ありがとう – nawfal

関連する問題