可能性の重複:フィールドがその
FieldInfo
例えば '新しい' 修飾子を持っている場合は次の宣言フィールドに反射を介して '新しい'修飾語があるかどうかを調べるにはどうすればよいですか?public class B : A { public new string Name; }
を持つ
How do I detect the "new" modifer on a field using reflection?
は、どのように私は決定していますか?
可能性の重複:フィールドがその
FieldInfo
例えば '新しい' 修飾子を持っている場合は次の宣言フィールドに反射を介して '新しい'修飾語があるかどうかを調べるにはどうすればよいですか?public class B : A { public new string Name; }
を持つ
How do I detect the "new" modifer on a field using reflection?
は、どのように私は決定していますか?
同じ名前のメンバーをベースクラス階層で検索する必要があります。そうでない場合は、新しいものです。
私はそれが醜いだけど、同じ質問How do I detect the "new" modifer on a field using reflection?に、この他の回答にコメントどおり、それは言う:
私はILSpyのソースコードを見ていた、彼らは同じことをやっている - 継承チェーンを歩いている。彼らはMono.Cecilを使用していますが、 は反映されずに利用できない特別な情報はありません。 の詳細については、ILSpyの
AstBuilder.SetNewModifier
メソッドをご覧ください。
おそらくあなたが期待していたものではありません。申し訳ありません。
はい、私はFieldInfo.IsNewのようなものを期待していましたが、あなたのソリューションは行く方法のように聞こえます。ありがとう! – UserControl
フィールドの場合は存在しません。 ILは単純です:
.field public string Name
など - 仮想フィールドまたはnewslotなどの概念がないので、あなたはあなたがやっている認めることを主張するためにここにnew
修飾子は、コンパイラの純粋が存在します少し紛らわしいもの。 new
を追加するとコンパイラの警告(CS0108)は表示されませんが、はILを変更しません。したがって、とnew
dフィールドとnew
なしで非表示になっているフィールドを区別することはできません。
パブリックアクセサプロパティを持つプライベートフィールドに自分自身を限定した方がよいでしょう。どちらの場合でも、ベースタイプのフィールドはまだ存在します。
このようなフィールドを公開しないでください...代わりにプロパティを使用してください。 –
また、新しい参照を作成するのではなく、値を設定するだけです。 –
@Daniel:この場合の新規の場合は、基底クラスのものを使用しないことを意味します –