(Vea a continuación la solución que creé usando la respuesta que acepté)
Estoy tratando de mejorar la capacidad de mantenimiento de algunos códigos que implican reflexión. La aplicación tiene una interfaz .NET Remoting que expone (entre otras cosas) un método llamado Ejecutar para acceder a partes de la aplicación que no están incluidas en su interfaz remota publicada.
Así es como la aplicación designa propiedades (una estática en este ejemplo) a las que se debe acceder mediante Ejecutar:
RemoteMgr.ExposeProperty("SomeSecret", typeof(SomeClass), "SomeProperty");
Entonces un usuario remoto podría llamar:
string response = remoteObject.Execute("SomeSecret");
y la aplicación usaría la reflexión para encontrar SomeClass.SomeProperty y devolver su valor como una cadena.
Desafortunadamente, si alguien cambia el nombre de SomeProperty y olvida cambiar el tercer parámetro de ExposeProperty (), se rompe este mecanismo.
Necesito el equivalente de:
SomeClass.SomeProperty.GetTheNameOfThisPropertyAsAString()
usar como el tercer parm en ExposeProperty para que las herramientas de refactorización se encarguen de los cambios de nombre.
¿Hay alguna forma de hacer esto? Gracias por adelantado.
De acuerdo, esto es lo que terminé creando (según la respuesta que seleccioné y la pregunta a la que hizo referencia):
// <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);
Ahora con esta genial capacidad, es hora de simplificar el método ExposeProperty. Pulir los pomos de las puertas es un trabajo peligroso ...
Gracias a todos.