2011-08-31 14 views
10

Duplicar posibles:
How do I detect the "new" modifer on a field using reflection?¿Cómo determinar si un campo tiene un "nuevo" modificador a través de la reflexión?

Tener la siguiente declaración

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

¿Cómo se determina si el campo tiene 'nuevo' modificador por su FieldInfo ejemplo?

+4

realmente no deberías exponer campos como este ... usa una propiedad en su lugar. –

+1

también debe establecer el valor, no crear una nueva referencia. –

+1

@Daniel: nuevo en este caso significa que no use el que está en la clase base –

Respuesta

5

Creo que necesitarás buscar en la jerarquía de clases base un miembro con el mismo nombre, y si no es así, entonces es nuevo.

sé que es feo, pero de acuerdo con el comentario sobre esta otra respuesta a la misma pregunta How do I detect the "new" modifer on a field using reflection?, que dice:

Me tomó un vistazo a código fuente de ILSpy, que están haciendo lo mismo - caminando por la cadena de herencia. Están usando Mono.Cecil, pero hay sin información especial que no está disponible a través de la reflexión. Para obtener más información sobre , consulte el método AstBuilder.SetNewModifier de ILSpy.

Probablemente no sea lo que esperaba, lo siento por eso.

+1

Sí, esperaba algo como FieldInfo.IsNew, pero su solución parece un camino por recorrer. ¡Gracias! – UserControl

8

Para los campos, no existe; la IL es simplemente:

.field public string Name 

etc - ya no existe el concepto de campos virtuales o newslot etc. El modificador new aquí existe puramente para el compilador, para que usted pueda afirmar que se reconoce que está haciendo algo un poco confuso Agregar el new aquí suprimirá una advertencia del compilador (CS0108), pero no cambia el IL. Como tal, no puede distinguir entre un campo formalmentenew d frente a un campo que se ha ocultado sin new.

Sin embargo, sería preferible limitarse a campos privados con propiedades de acceso público. Y tenga en cuenta que en cualquier caso: el campo en el tipo base todavía existe.

Cuestiones relacionadas