(Voir ci-dessous la solution que j'ai créée en utilisant la réponse que j'ai acceptée)
J'essaie d'améliorer la maintenabilité de certains codes impliquant la réflexion. L'application possède une interface .NET Remoting exposant (entre autres) une méthode appelée Exécuter pour accéder à des parties de l'application non incluses dans son interface distante publiée.
Voici comment l'application désigne les propriétés (statiques dans cet exemple) qui sont censées être accessibles via Execute:
RemoteMgr.ExposeProperty("SomeSecret", typeof(SomeClass), "SomeProperty");
Ainsi, un utilisateur distant pourrait appeler:
string response = remoteObject.Execute("SomeSecret");
et l'application utiliserait la réflexion pour trouver SomeClass.SomeProperty et retourner sa valeur sous forme de chaîne.
Malheureusement, si quelqu'un renomme SomeProperty et oublie de modifier le 3ème paramètre de ExposeProperty (), il rompt ce mécanisme.
J'ai besoin de l'équivalent de:
SomeClass.SomeProperty.GetTheNameOfThisPropertyAsAString()
à utiliser comme 3e paramètre dans ExposeProperty afin que les outils de refactoring se chargent des renommages.
Y a-t-il un moyen de faire cela? Merci d'avance.
D'accord, voici ce que j'ai fini par créer (en fonction de la réponse que j'ai sélectionnée et de la question à laquelle il a fait référence):
// <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;
}
Usage:
// Static Property
string name = GetPropertyName(() => SomeClass.SomeProperty);
// Instance Property
string name = GetPropertyName(() => someObject.SomeProperty);
Maintenant, avec cette fonctionnalité intéressante, il est temps de simplifier la méthode ExposeProperty. Le polissage des poignées de porte est un travail dangereux ...
Merci tout le monde.