2010-06-08 19 views
11

Digamos, por ejemplo, tengo esta clase simple:Obtener PropertyInfo de propiedad en lugar del nombre

public class MyClass 
{ 
    public String MyProperty { get; set; } 
} 

La manera de conseguir el PropertyInfo para MyProperty sería:

typeof(MyClass).GetProperty("MyProperty"); 

Este apesta!

¿Por qué? Fácil: se interrumpirá tan pronto como cambie el nombre de la propiedad, necesita una gran cantidad de pruebas dedicadas para encontrar cada ubicación donde se usa una propiedad como esta, los árboles de refactorización y uso no pueden encontrar este tipo de acceso.

¿No hay alguna forma de acceder correctamente a una propiedad? Algo, que está validado en tiempo de compilación?
me gustaría un comando como este:

propertyof(MyClass.MyProperty); 
+3

Se pone peor. Si observa WPF, notará que requiere nombres de propiedad de cadena para el enlace de datos y también cuando implementa INotifyPropertyChanged. Este no es un caso de esquina para los usuarios de Reflection, sino el caso general de uso diario. Actualmente confío en Resharper para ayudar a mantener las cosas sincronizadas. –

+0

Unitesting me ayudó mucho aquí, pero eso es todo ... – Enriquev

+0

Pregunta de desbordamiento de pila relacionada con respuestas más detalladas: http://stackoverflow.com/questions/491429/how-to-get-the-propertyinfo-of-a- propiedad-específica –

Respuesta

2

El proyecto Caliburn tiene una buena aplicación de lo Usted está buscando para cuidar los nombres de las propiedades INotifyPropertyChanged. Puede adaptar el código de expresión a lo que necesita hacer. Consulte la clase Caliburn.Core.PropertyChangedBase.

+0

Interesante! Esto me ayuda a entender la respuesta de Jon Skeets. – Sam

-1

El todo punto de reflexión es poder acceder a material en tiempo de ejecución. Si suponemos que su operador funcionaría, ya tiene la información de la clase y, por lo tanto, la propiedad, lo que lo hace completamente inútil.

+0

Ya tengo la propiedad? Sin el nombre en el texto? ¿Cómo? – Sam

6

Lo más cerca que se puede llegar por el momento es el uso de un árbol de expresión:

GetProperty<MyClass>(x => x.MyProperty) 

y luego aspirar el PropertyInfo en GetProperty (que tendría que escribir). Sin embargo, eso es algo frágil: no hay garantía en tiempo de compilación de que el árbol de expresiones sea solo un acceso a la propiedad.

Otra alternativa es mantener los nombres de las propiedades que está utilizando en algún lugar que puedan probarse en unidades con facilidad, y confíe en eso.

Básicamente lo que quiere es la mítica infoof operador que se ha hablado muchas veces por el equipo de C# -, pero que no ha pasado el corte hasta el momento :(

+0

Parece intrigante, pero ¿cómo podría escribir GetProperty? Ni siquiera estoy seguro * qué * it es - una clase genérica? O solo un método genérico? infoof suena adorable, lástima que no está en (aún). – Sam

0

En el tiempo transcurrido desde que se publicó esta pregunta, C# 6 ha sido lanzado con el nameof operator. Esto permite acceder a una propiedad con el siguiente

PropertyInfo myPropertyInfo = typeof(MyClass).GetProperty(nameof(MyClass.MyProperty)); 

Si cambia el nombre de la propiedad, este código no se compilará (en realidad lo hará, ya que el cambio de nombre también cambiará esta línea de código si el cambio de nombre se realiza correctamente).

Cuestiones relacionadas