2011-07-09 15 views
5

http://msdn.microsoft.com/en-us/library/435f1dw2.aspxJak wykryć "nowy" modifer na polu za pomocą odbicia?

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); 
    } 
} 

EDIT: wiem do metod i właściwości mogę sprawdzić "MethodBase.IsHideBySig". Dlaczego nie istnieje podobna właściwość dla FieldInfo?

Odpowiedz

2

Tylko zgadnij, ale myślę, że musiałbyś przeszukać klasę podstawową dla członka o nazwie o tej samej nazwie.

Można również rzucić okiem na wygenerowaną IL dla obu pól, aby zobaczyć, czy są jakieś różnice, które można wykorzystać poprzez odbicie.

+0

To jest podejście, którego miałem nadzieję uniknąć. – Simon

+2

Spojrzałem na kod źródłowy ILSpy, robią to samo - idąc łańcuchem dziedziczenia. Używają Mono.Cecil, ale nie ma specjalnych informacji, które są niedostępne poprzez odbicie. Aby uzyskać więcej informacji, spójrz na metodę "AstBuilder.SetNewModifier" ILSpy. –

+0

Po prostu, jak myślałem ... –

1

Jedynym skutkiem ataku new jest tutaj wyłączenie ostrzeżenia kompilatora.

Domyślam się, że nie pozostawia żadnego śladu w wygenerowanym IL.

Pytanie odliczające: Dlaczego jesteś zainteresowany? Po prostu ciekawy czy masz praktyczny scenariusz?

+0

"tutaj nowy jest tłumienie ostrzeżenia kompilatora" ?? ale tak nie jest w przypadku metod i właściwości. Mogę sprawdzić "MethodBase.IsHideBySig". Dlaczego jest inaczej w przypadku pól? – Simon

+0

pola nigdy nie mogą być wirtualne. –

+0

"Pola nigdy nie mogą być wirtualne" true. jednak wciąż jestem zaskoczony, że mogę dodać modyfikator do pola i wygenerować dokładnie taką samą IL. – Simon

Powiązane problemy