2016-03-31 14 views
8

C'è un modo per ottenere il nome della proprietà corrente in un getter/setter?C# 6: nameof() proprietà corrente in getter/setter

Qualcosa di simile a questo:

public string MyProperty 
{ 
    get { return base.Get<string>(nameof(ThisProperty)); } 
    set { base.Set<string>(nameof(ThisProperty), value); } 
} 

(ThisProperty sarebbero tornati "MyProperty").

Grazie!

+1

'nameof (MyProperty)' dovrebbe funzionare correttamente? – MarcinJuraszek

+5

Perché dovrebbe esserci? Qual è il problema con la scrittura di 'nameof (MyProperty)'? –

+0

Questo potrebbe essere utile in un caso in cui il nome 'MyProperty' potrebbe cambiare: quindi, è necessario ricordare di aggiornare' nameof (qualunque cosa) ', sebbene l'IDE di Visual Studio dovrebbe rilevare questo problema. – levelonehuman

risposta

17

Non può essere eseguito con nameof, ma c'è un modo ancora migliore (disponibile da C# 5). È possibile effettuare la propertyName parametro opzionale e applicare l'attributo CallerMemberName ad esso:

protected void Set<T>(T value, [CallerMemberName] string propertyName = null) 
{ 
    ... 
} 

protected T Get<T>([CallerMemberName] string propertyName = null) 
{ 
    ... 
} 

Ora, se si omette l'argomento per propertyName, il nome del membro corrente viene passato implicitamente:

public string MyProperty 
{ 
    get { return base.Get<string>(); } // same as calling Get<string>("MyProperty") 
    set { base.Set<string>(value); } // same as calling Set<string>(value, "MyProperty") 
} 
+0

Questo è una risposta sorprendente! Grazie Signore! – Smartis

+0

Grazie mille! – evaenrique

+0

Mi permetto di dissentire dalla prima frase. A partire da C# 6, 'nameof' eseguirà effettivamente il lavoro:' stringa pubblica MyProperty { get {return base.Get (nameof (MyProperty)); } set {base. Set (nomeof (MiaProprietà), valore); } } ' – takrl

-3

alternativa è al il MethodBase poiché Get e Set sono essenzialmente metodi.

public string MyProperty 
{ 
    get 
    { 
     return MethodBase.GetCurrentMethod().Name.Substring(4); 
    }    
} 

La stringa c'è perché ogni nome è preceduto da get_ e set_

Ciò restituisce MyProperty come risultato.

Problemi correlati