2011-07-09 15 views
5

http://msdn.microsoft.com/en-us/library/435f1dw2.aspx¿Cómo puedo detectar el modificador "nuevo" en un campo utilizando la reflexión?

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

Editar: sé para Métodos y propiedades puedo comprobar "MethodBase.IsHideBySig". ¿Por qué no existe una propiedad similar para FieldInfo?

Respuesta

2

Solo supongo, pero creo que tendrías que buscar en la clase base para un miembro con el mismo nombre.

También podría echar un vistazo a la IL generada para ambos campos para ver si hay alguna diferencia que pueda usar a través de la reflexión.

+0

Este es el enfoque que esperaba evitar. – Simon

+2

Eché un vistazo al código fuente de ILSpy, están haciendo lo mismo: recorrer la cadena de herencia. Están usando Mono.Cecil, pero no hay información especial que no esté disponible a través de la reflexión. Para obtener más información, eche un vistazo al método 'AstBuilder.SetNewModifier' de ILSpy. –

+0

¿Cómo pensé ... –

1

El único efecto de new aquí es suprimir una advertencia del compilador.

Supongo que no deja rastro en la IL generada.

Pregunta de contador: ¿Por qué estás interesado? Solo curiosidad o tienes un escenario práctico?

+0

"nuevo aquí es para suprimir una advertencia del compilador" ?? pero este no es el caso para Métodos y Propiedades. Puedo verificar "MethodBase.IsHideBySig". ¿Por qué es diferente para los campos? – Simon

+0

los campos nunca pueden ser virtuales. –

+0

"los campos nunca pueden ser virtuales" verdadero. sin embargo, todavía estoy sorprendido de que pueda agregar un modificador a un campo y tener exactamente el mismo IL generado. – Simon

Cuestiones relacionadas