2012-01-05 8 views
4

fieldInfoクラスのSetFieldsメソッドは、最初のパラメータとしてオブジェクトを使用します。静的な読み取り専用フィールドの値をC#でのリフレクションを使って変更する方法はありますか?C#でリフレクションを使用して静的な読み取り専用フィールドの値を変更するにはどうすればよいですか?

これまでのところ、私はあなたが近くにいる

var field = typeof(ClassName).GetField("FieldName",BindingFlags.Instance|BindingFlags.NonPublic); 
+3

なぜあなたはそれをしたいですか?それがあなたのコードなら、それを静的な読み取り専用として宣言しないでください。そうでない場合は、おそらく何かを壊すでしょう。 – Richard

+2

@リチャードあなたが物事を「間違って」混乱させるようにしたいと思っているケースは本当です。さらに、システムを回避しようとしなかった場合、どんな種類のハッカーがいるだろうか? – Crisfole

+0

同様の答えは、[私はC#でリフレクションを使用してプライベートの読み取り専用フィールドを変更することはできますか?](0120-18753) –

答えて

3

を持っています。 BindingFlagが間違っています。 Instanceは、代わりにインスタンスフィールドを意味し、あなたはBindingFlags.Staticを使用する必要があります。

var field = typeof(ClassName).GetField("FieldName",BindingFlags.Static|BindingFlags.NonPublic); 
5

あなたは、静的フィールドを取得したい場合は、後者はインスタンスフィールドのためであるとして、あなたは、BindingFlags.Static代わりのBindingFlags.Instanceを使用する必要があります。

field.SetValue(null, newValue)を使用して値を設定できます。オブジェクトインスタンスが必要ないため、nullがターゲットパラメータとして渡されることに注意してください。あなたは十分な特権を持っていると仮定すると、リフレクションは喜んで、読み取り専用フィールドの値を変更します。

+1

私はこれで面白い状況がある、 'field.GetValue新しい値を返しますが、フィールドへの直接アクセス( 'Trace.WriteLine(FieldName)'など)は古い値を返します。 –

+0

Greg、これを試しましたか?なぜなら、私は別の結果を得ているからです。私はこのようにreadonlyインスタンスフィールドを設定できますが、読み取り専用静的フィールドは設定できません。 – smartcaveman

+0

おそらく私は2年前にそれを試したランタイムのどのバージョンでも動作しました。しかし、あなたはこれを行うべきではないこと、それがランタイムとの契約に違反していること、そしてランタイムへのアップデートが動作を停止させる可能性があることは明らかです。私は彼らが持っていると思います! –

関連する問題