2009-11-03 3 views

risposta

6

È possibile utilizzare le espressioni per ottenere questo risultato abbastanza facilmente. Vedi questo blog for a sample.

Ciò consente di creare un'espressione tramite una lambda e di estrarre il nome. Per esempio, l'implementazione INotifyPropertyChanged può essere rielaborato per fare qualcosa di simile:

public int MyProperty { 
    get { return myProperty; } 
    set 
    { 
     myProperty = value; 
     RaisePropertyChanged(() => MyProperty); 
    } 
} 

Al fine di mappare l'equivalente, utilizzando la classe di riferimento "Rifletti", si sarebbe fare qualcosa di simile:

string propertyName = Reflect.GetProperty(() => SomeProperty).Name; 

Viola - nomi di proprietà senza stringhe magiche.

+0

La sintassi qui è un po 'brutta, ma fa quello che mi serviva. Grazie! –

1

È possibile ottenere un elenco di proprietà di un oggetto mediante la riflessione.

MyClass o; 

PropertyInfo[] properties = o.GetType().GetProperties(
    BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance 
); 

ogni proprietà ha un attributo name che si otterrebbe "SomeProperty"

8

Questo approccio sarà modo più veloce rispetto all'utilizzo di Expression

public static string GetName<T>(this T item) where T : class 
{ 
    if (item == null) 
     return string.Empty; 

    return typeof(T).GetProperties()[0].Name; 
} 

Ora si può chiamare:

new { MyClass.SomeProperty }.GetName(); 

È possibile memorizzare i valori nella cache se sono necessarie prestazioni ancora maggiori. Vedere questa domanda duplicata How do you get a variable's name as it was physically typed in its declaration?

+0

La migliore risposta qui. Non voglio eseguire il loop delle proprietà, voglio ottenere un nome di proprietà basato su una proprietà effettiva. Usare il tipo anonimo con la prima (unica) proprietà da cui si vuole il nome è geniale. – Paul

+0

@Paul Non sono il genio dietro di esso. In secondo luogo, non è molto amichevole con il refattore. Voglio dire se cambi il nome della proprietà, il tipo anonimo conserva il nome originale. In questo caso, se si modifica 'SomeProperty' in' SomeProperty1', la classe anonima cambia in 'new {SomeProperty = SomeProperty1}', che stamperà "SomeProperty", invece del nome aggiornato "SomeProperty1". Lo menzionerò nella risposta. – nawfal

+0

Dann. Non prevedo mai di cambiare il nome di una proprietà, ma se mai l'avessi fatto, vorrei che il refactoring lo gestisse. Grazie per avermi fatto sapere. – Paul