2011-08-31 16 views
10

可能性の重複:フィールドがそのFieldInfo例えば '新しい' 修飾子を持っている場合は次の宣言フィールドに反射を介して '新しい'修飾語があるかどうかを調べるにはどうすればよいですか?

public class B : A 
{ 
    public new string Name; 
} 

を持つ
How do I detect the "new" modifer on a field using reflection?

は、どのように私は決定していますか?

+4

このようなフィールドを公開しないでください...代わりにプロパティを使用してください。 –

+1

また、新しい参照を作成するのではなく、値を設定するだけです。 –

+1

@Daniel:この場合の新規の場合は、基底クラスのものを使用しないことを意味します –

答えて

5

同じ名前のメンバーをベースクラス階層で検索する必要があります。そうでない場合は、新しいものです。

私はそれが醜いだけど、同じ質問How do I detect the "new" modifer on a field using reflection?に、この他の回答にコメントどおり、それは言う:

私はILSpyのソースコードを見ていた、彼らは同じことをやっている - 継承チェーンを歩いている。彼らはMono.Cecilを使用していますが、 は反映されずに利用できない特別な情報はありません。 の詳細については、ILSpyのAstBuilder.SetNewModifierメソッドをご覧ください。

おそらくあなたが期待していたものではありません。申し訳ありません。

+1

はい、私はFieldInfo.IsNewのようなものを期待していましたが、あなたのソリューションは行く方法のように聞こえます。ありがとう! – UserControl

8

フィールドの場合は存在しません。 ILは単純です:

.field public string Name 

など - 仮想フィールドまたはnewslotなどの概念がないので、あなたはあなたがやっている認めることを主張するためにここにnew修飾子は、コンパイラの純粋が存在します少し紛らわしいもの。 newを追加するとコンパイラの警告(CS0108)は表示されませんが、はILを変更しません。したがって、new dフィールドとnewなしで非表示になっているフィールドを区別することはできません。

パブリックアクセサプロパティを持つプライベートフィールドに自分自身を限定した方がよいでしょう。どちらの場合でも、ベースタイプのフィールドはまだ存在します

関連する問題