2011-07-09 4 views
5

http://msdn.microsoft.com/en-us/library/435f1dw2.aspxリフレクションを使用してフィールド上の「新しい」修飾子を検出するにはどうすればよいですか?

public class Base 
{ 
    public string Field; 
} 
public class Child : Base 
{ 
    public new string Field; 
} 

[TestFixture] 
public class TestClass 
{ 

    [Test] 
    public void DetectNew() 
    { 
     var fieldInfo = typeof(Child).GetField("Field"); 
     //How do I tell fieldInfo has a new modifier? 
     Debug.WriteLine(fieldInfo); 
    } 
} 

編集:私は "MethodBase.IsHideBySig" を確認することができますメソッドとプロパティのために知っています。なぜFieldInfoに似たプロパティが存在しないのですか?

答えて

2

ちょうど推測ですが、のメンバーのベースクラスを同じ名前で検索する必要があると思います。

両方のフィールドで生成されたILを見て、リフレクションで使用できる違いがあるかどうかを確認することもできます。

+0

これは避けたいアプローチです。 – Simon

+2

私はILSpyのソースコードを見て、彼らは同じことをやっています - 継承チェーンを歩いています。彼らはMono.Cecilを使用していますが、リフレクションでは利用できない特別な情報はありません。詳細については、ILSpyの 'AstBuilder.SetNewModifier'メソッドを見てください。 –

+0

ちょうど私が思った... –

1

newの唯一の効果は、コンパイラの警告を抑制することです。

私は、生成されたILにトレースが残っていないと思います。

質問:なぜ興味がありますか?単に好奇心が強いか、実践的なシナリオがありますか?

+0

"新しいここにコンパイラの警告を抑制する"ですか?これはメソッドとプロパティの場合ではありません。私は "MethodBase.IsHideBySig"をチェックすることができます。 フィールドで異なる理由は何ですか? – Simon

+0

フィールドを決して仮想にすることはできません。 –

+0

"フィールドは仮想になることは絶対にありません"。しかし、私はまだフィールドに修飾子を追加して、まったく同じILを生成できることに驚いています。 – Simon

関連する問題