(Voir ci-dessous la solution que j'ai créé à l'aide de la réponse que j'ai accepté)
Je suis d'essayer d'améliorer la maintenabilité du code impliquant la réflexion. L'application dispose d'une .NET Remoting interface de l'exposer (entre autres choses) une méthode appelée Exécuter pour accéder à des parties de l'application ne figurant pas dans son publié interface à distance.
Voici comment l'application désigne les propriétés (statique dans cet exemple) qui sont destinés à être accessible par l'intermédiaire de l'Exécuter:
RemoteMgr.ExposeProperty("SomeSecret", typeof(SomeClass), "SomeProperty");
Ainsi, un utilisateur distant peut appeler:
string response = remoteObject.Execute("SomeSecret");
et l'application serait d'utiliser la réflexion pour trouver SomeClass.SomeProperty et renvoie sa valeur sous forme de chaîne.
Malheureusement, si quelqu'un renomme SomeProperty et oublie de changer la 3ème parm de ExposeProperty(), il se casse de ce mécanisme.
J'ai besoin de l'équivalent de:
SomeClass.SomeProperty.GetTheNameOfThisPropertyAsAString()
à utiliser comme la 3ème parm dans ExposeProperty donc le refactoring prendrait soin de renomme.
Est-il un moyen de faire cela? Merci à l'avance.
Ok, voici ce que j'ai fini par créer (en fonction de la réponse que j'ai sélectionné et la question qu'il a référencés):
// <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;
}
Utilisation:
// Static Property
string name = GetPropertyName(() => SomeClass.SomeProperty);
// Instance Property
string name = GetPropertyName(() => someObject.SomeProperty);
Maintenant, avec ce cool capacité, il est temps de simplifier la ExposeProperty méthode. Polissage des poignées de porte est un travail dangereux...
Merci à tous.