2010-06-08 14 views
11

Diciamo, per esempio, ho questo semplice classe:Get PropertyInfo dalla proprietà invece del nome

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

Il modo per ottenere il PropertyInfo per MyProperty sarebbe:

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

Questo fa schifo!

Perché? Facile: si romperà non appena cambierò il nome della proprietà, ha bisogno di un sacco di test dedicati per trovare ogni posizione in cui una proprietà viene utilizzata in questo modo, refactoring e alberi di utilizzo non sono in grado di trovare questo tipo di accesso.

Non c'è un modo per accedere correttamente a una proprietà? Qualcosa, che è convalidato in fase di compilazione?
Mi piacerebbe un comando come questo:

propertyof(MyClass.MyProperty); 
+3

Diventa peggio. Se si guarda a WPF, si noterà che richiede nomi di stringhe per l'associazione dei dati e anche quando si implementa INotifyPropertyChanged. Questo non è un caso limite per gli utenti di Reflection, ma il caso d'uso generale di tutti i giorni. Attualmente mi affido a Resharper per mantenere le cose in sincronia. –

+0

Unitesting mi ha aiutato molto qui, ma questo è tutto ... – Enriquev

+0

Domanda di overflow dello stack correlato con risposte più dettagliate: http://stackoverflow.com/questions/491429/how-to-get-the-propertyinfo-of-a- specifica-proprietà –

risposta

2

Il progetto Caliburn ha una buona implementazione di ciò che stai cercando di occuparti dei nomi delle proprietà di INotifyPropertyChanged.Puoi adattare il codice dell'espressione a quello che devi fare.Ascolta la classe Caliburn.Core.PropertyChangedBase.

+0

Interessante! Questo mi aiuta a capire la risposta di Jon Skeets. – Sam

-1

Il punto di riflessione è quello di essere in grado di accedere roba in fase di esecuzione. Se assumiamo che il tuo operatore funzioni, hai già le informazioni sulla classe e quindi la proprietà, rendendo l'intera faccenda completamente inutile.

+0

Ho già la proprietà? Senza il nome nel testo? Che cosa ??? – Sam

6

Il più vicino si può venire in questo momento è quello di utilizzare un albero di espressione:

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

e poi succhiare il PropertyInfo in GetProperty (che dovreste scrivere). Tuttavia, ciò è alquanto fragile: non esiste alcuna garanzia in fase di compilazione che l'albero delle espressioni sia solo un accesso di proprietà.

Un'altra alternativa consiste nel mantenere facilmente i nomi delle proprietà che si stanno utilizzando, che possono essere facilmente testati su unità e fare affidamento su questo.

In sostanza ciò che si vuole è la mitica infoof operatore che si è parlato molte volte dal team di C# - ma che non ha fatto il taglio finora :(

+0

Sembra intrigante - ma come scriverò GetProperty? Non sono nemmeno sicuro * cosa * è - una classe generica? O semplicemente un metodo generico? infoof suoni belli, peccato che non sia (ancora). – Sam

0

Nel tempo da quando questa domanda è stata pubblicata, C# 6 è stato rilasciato con il nameof operator. Ciò consente a una proprietà di accedere con il seguente

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

Se si rinomina la proprietà, questo codice non verrà compilato (in realtà lo sarà, poiché la rinomina cambierà anche questa riga di codice se la ridenominazione viene eseguita correttamente).

Problemi correlati