class Bla
{
public readonly int sum;
}
FieldInfo f = type.GetField("sum");
f.?? // what?
sum
が読み取り専用かどうかを確認するにはどうすればよいですか?プロパティの場合、メンバーに書き込みアクセス権があるかどうかを調べるためにPropertyInfo.CanWrite
を実行できます。メンバ変数が読み込み専用かどうかを調べる方法は?
class Bla
{
public readonly int sum;
}
FieldInfo f = type.GetField("sum");
f.?? // what?
sum
が読み取り専用かどうかを確認するにはどうすればよいですか?プロパティの場合、メンバーに書き込みアクセス権があるかどうかを調べるためにPropertyInfo.CanWrite
を実行できます。メンバ変数が読み込み専用かどうかを調べる方法は?
readonly
は、フィールドの宣言の近くまたはコンストラクタ内でのみフィールドの割り当てが行われることを意味します。だから、
はフィールドのみ
FieldInfo f = typeof(Bla).GetField("sum");
Console.WriteLine(f.IsInitOnly); //return true
上にあるコンストラクタの本体で設定することができるかどうかを示す値を取得
FieldInfo
に
IsInitOnly
プロパティを、使用することができます
注: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
の場合にのみ例外がスローされます。
f.Attributes
FieldAttributes.InitOnly
'NonPublic'フラグがここでやっている任意のアイデアが含まれている必要がありますか? – nawfal
@nawfal 'GetField'はデフォルトでプライベートフィールドを返しません。あなたは明示的にこれを設定する必要があります –
@ああ私はそれを得る。私はあなたの例を気にしていませんでした。ありがとう – nawfal