(Veja abaixo a solução que criei usando a resposta que aceitei)
Estou tentando melhorar a manutenção de algum código que envolve reflexão. O aplicativo possui uma interface .NET Remoting que expõe (entre outras coisas) um método chamado Execute para acessar partes do aplicativo não incluídas em sua interface remota publicada.
Aqui está como o aplicativo designa propriedades (estáticas neste exemplo) que devem ser acessíveis via Execute:
RemoteMgr.ExposeProperty("SomeSecret", typeof(SomeClass), "SomeProperty");
Portanto, um usuário remoto pode ligar para:
string response = remoteObject.Execute("SomeSecret");
e o aplicativo usaria a reflexão para encontrar SomeClass.SomeProperty e retornar seu valor como uma sequência.
Infelizmente, se alguém renomeia SomeProperty e esquece de alterar o terceiro par de ExposeProperty (), ele quebra esse mecanismo.
Eu preciso do equivalente a:
SomeClass.SomeProperty.GetTheNameOfThisPropertyAsAString()
para usar como o terceiro parm em ExposeProperty, para que as ferramentas de refatoração cuidem de renomear.
Existe uma maneira de fazer isso? Desde já, obrigado.
Ok, eis o que acabei criando (com base na resposta que selecionei e na pergunta que ele referenciou):
// <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);
Agora, com esse recurso interessante, é hora de simplificar o método ExposeProperty. Polir maçanetas é um trabalho perigoso ...
Obrigado a todos.