(Siehe unten stehende Lösung, die ich mit der von mir akzeptierten Antwort erstellt habe.)
Ich versuche, die Wartbarkeit von Code mit Reflexion zu verbessern. Die App verfügt über eine .NET Remoting-Oberfläche, die unter anderem eine Methode namens Execute für den Zugriff auf Teile der App bereitstellt, die nicht in der veröffentlichten Remote-Oberfläche enthalten sind.
So bestimmt die App Eigenschaften (in diesem Beispiel eine statische), auf die über Execute zugegriffen werden soll:
RemoteMgr.ExposeProperty("SomeSecret", typeof(SomeClass), "SomeProperty");
Ein entfernter Benutzer könnte also anrufen:
string response = remoteObject.Execute("SomeSecret");
und die App würde Reflection verwenden, um SomeClass.SomeProperty zu finden und seinen Wert als Zeichenfolge zurückzugeben.
Wenn jemand SomeProperty umbenennt und vergisst, den 3. Parameter von ExposeProperty () zu ändern, wird dieser Mechanismus leider unterbrochen.
Ich muss das Äquivalent von:
SomeClass.SomeProperty.GetTheNameOfThisPropertyAsAString()
Als 3. Parameter in ExposeProperty zu verwenden, damit Refactoring-Tools das Umbenennen übernehmen.
Gibt es eine Möglichkeit, dies zu tun? Danke im Voraus.
Okay, hier ist, was ich letztendlich erstellt habe (basierend auf der Antwort, die ich ausgewählt habe, und der Frage, auf die er verwiesen hat):
// <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;
}
Verwendung:
// Static Property
string name = GetPropertyName(() => SomeClass.SomeProperty);
// Instance Property
string name = GetPropertyName(() => someObject.SomeProperty);
Mit dieser coolen Funktion ist es jetzt an der Zeit, die ExposeProperty-Methode zu vereinfachen. Das Polieren von Türklinken ist eine gefährliche Arbeit ...
Vielen Dank an alle.