(Vedi sotto la soluzione che ho creato usando la risposta che ho accettato)
Sto cercando di migliorare la manutenibilità di alcuni codici che coinvolgono la riflessione. L'app ha un'interfaccia .NET Remoting che espone (tra le altre cose) un metodo chiamato Execute per accedere a parti dell'app non incluse nell'interfaccia remota pubblicata.
Ecco come l'app designa le proprietà (statiche in questo esempio) che devono essere accessibili tramite Execute:
RemoteMgr.ExposeProperty("SomeSecret", typeof(SomeClass), "SomeProperty");
Quindi un utente remoto può chiamare:
string response = remoteObject.Execute("SomeSecret");
e l'app userebbe la reflection per trovare SomeClass.SomeProperty e restituire il suo valore come stringa.
Sfortunatamente, se qualcuno rinomina SomeProperty e si dimentica di cambiare il terzo parametro di ExposeProperty (), si rompe questo meccanismo.
Ho bisogno dell'equivalente di:
SomeClass.SomeProperty.GetTheNameOfThisPropertyAsAString()
da utilizzare come terzo parm in ExposeProperty in modo che gli strumenti di refactoring si occupassero della ridenominazione.
C'è un modo per fare questo? Grazie in anticipo.
Ok, ecco cosa ho finito per creare (in base alla risposta che ho selezionato e alla domanda a cui faceva riferimento):
// <summary>
// Get the name of a static or instance property from a property access lambda.
// </summary>
// <typeparam name="T">Type of the property</typeparam>
// <param name="propertyLambda">lambda expression of the form: '() => Class.Property' or '() => object.Property'</param>
// <returns>The name of the property</returns>
public string GetPropertyName<T>(Expression<Func<T>> propertyLambda)
{
var me = propertyLambda.Body as MemberExpression;
if (me == null)
{
throw new ArgumentException("You must pass a lambda of the form: '() => Class.Property' or '() => object.Property'");
}
return me.Member.Name;
}
Uso:
// Static Property
string name = GetPropertyName(() => SomeClass.SomeProperty);
// Instance Property
string name = GetPropertyName(() => someObject.SomeProperty);
Ora con questa fantastica funzionalità, è tempo di semplificare il metodo ExposeProperty. Lucidare le maniglie è un lavoro pericoloso ...
Grazie a tutti.