2009-05-12 9 views
5

Por favor tengan paciencia si esta pregunta no está bien formulada. No saber es parte del problema.Se refiere a la propiedad en C#. ¿Reflexión? ¿Genérico? ¿Tipo?

Un ejemplo de lo que me gustaría lograr se puede encontrar en PropertyChangedEventArgs en WPF. Si desea bandera que una propiedad ha cambiado en WPF, lo haces de esta manera:

PropertyChanged(this, new PropertyChangedEventArgs("propertyName")); 

pasa una cadena a PropertyChangedEventArgs que se refiere al nombre propiedad que cambió.

Puede imaginarse que realmente no quiero cadenas codificadas para nombres de propiedades en todo mi código. Refactor-rename lo echa de menos, por supuesto, lo que lo hace no solo estéticamente desagradable sino también propenso a errores.

Preferiría mucho referirse a la propiedad en sí ... de alguna manera.

PropertyChanged(this, new PropertyChangedEventArgs(?SomeClass.PropertyName?)); 

Parece que debería poder envolver esto en un método breve que me permita decir algo como lo anterior.

private void MyPropertyChanged(??) { 
    PropertyChanged(this, new PropertyChangedEventArgs(??.ToString()??)); 
} 

... so I can say something like: 
MyPropertyChanged(Person.Name); //where I'm interested in the property *itself* 

Hasta ahora estoy dibujando un espacio en blanco.

+0

ver también http://stackoverflow.com/questions/388775/how-do-i-get-the-name-of-a-property-from-a-property-in-c-2-0 –

+0

http : //weblogs.asp.net/cazzu/archive/2006/07/06/Linq-beyond-queries_3A00_-strong_2D00_typed-reflection_2100_.aspx –

+0

posible duplicado de [Obtener el nombre del método y el tipo utilizando la expresión lambda] (http://stackoverflow.com/questions/273941/get-method-name-and-type-using-lambda-expression) – nawfal

Respuesta

6

Desafortunadamente, no hay una manera directa de hacerlo; sin embargo, puede hacerlo en .NET 3.5 a través de Expression. See here para más. Para copiar el ejemplo:

PropertyInfo prop = PropertyHelper<Foo>.GetProperty(x => x.Bar); 

(que es bastante simple de cambiar eso para devolver el nombre en lugar de la PropertyInfo).

Del mismo modo, sería bastante sencillo escribir una variante:

OnPropertyChanged(x=>x.Name); 

usando:

OnPropertyChanged<T>(Expression<Func<MyType,T>> property) {...} 
+0

gracias - gran idea –

1

Ésta es una característica solicitada con frecuencia, generalmente llamado infoof ("información del"), el cual devolvería el objeto de reflexión asociado con un miembro, por ejemplo

PropertyInfo pi = infoof(Person.Name); 

Lamentablemente, la palabra clave dinámica está absorbiendo el tiempo del equipo del compilador de C#.

+0

Casualmente, la semana pasada escribí un artículo de blog sobre "¿por qué todavía no hay información?" Espere a finales de este mes. –

+0

Cool, ¿dice "Porque te estamos dando algo más como una característica sorpresa en C# 4 que hace lo mismo, pero incluso mejor de lo que imaginabas?"? * cruza los dedos * –

+0

No. Dice que "la función es demasiado trabajo por el beneficio que produce". Lamento decepcionar. –

1

Estoy bastante seguro de que no hay manera de no especificar una cadena - no hay característica integrada en C# o .NET que permite pasar las referencias a las propiedades, por lo que yo sé, y pasar un string a la API de reflexión es por lejos el método más simple.

Sin embargo, aparte del estándar .NET, puede encontrar su solución en PostSharp (Programación Orientada a Aspectos para .NET), que le permite agregar código que automatiza la generación de eventos cuando cambian varias propiedades, como lo ha demostrado en su pregunta.

+0

La API Expression lo permite; en mi respuesta, mira "Ver aquí" para ver un ejemplo. –

+0

@Marc: Sí, parece que tienes razón, aunque ese es un método terriblemente redondo. Además, me parece bastante feo (al menos, la sintaxis es complicada), pero quién soy yo para decir ... eso puede ser lo que el que hace las preguntas prefiere. – Noldorin

Cuestiones relacionadas