(Zobacz poniżej rozwiązanie, które utworzyłem przy użyciu odpowiedzi, którą zaakceptowałem)
Usiłuję poprawić konserwowalność kodu wymagającego refleksji. Aplikacja ma interfejs zdalny .NET, odsłaniając (między innymi) metodę o nazwie Wykonaj, aby uzyskać dostęp do części aplikacji nie zawartych w opublikowanym zdalnym interfejsie.
Oto, w jaki sposób aplikacja określa właściwości (w tym przykładzie statyczne), które mają być dostępne za pośrednictwem polecenia Wykonaj:
RemoteMgr.ExposeProperty("SomeSecret", typeof(SomeClass), "SomeProperty");
Aby użytkownik zdalny mógł zadzwonić:
string response = remoteObject.Execute("SomeSecret");
a aplikacja użyłaby odbicia, aby znaleźć SomeClass.SomeProperty i zwrócić jego wartość jako ciąg.
Niestety, jeśli ktoś zmieni nazwę SomeProperty i zapomni zmienić trzecią parmę ExposeProperty (), zepsuje ten mechanizm.
Potrzebuję odpowiednika:
SomeClass.SomeProperty.GetTheNameOfThisPropertyAsAString()
do użycia jako 3. parma w ExposeProperty, aby narzędzia do refaktoryzacji zajęłyby się nazwami.
Czy jest na to sposób? Z góry dziękuję.
Okej, oto co ostatecznie stworzyłem (na podstawie wybranej przeze mnie odpowiedzi i pytania, do którego się odwołał):
// <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;
}
Stosowanie:
// Static Property
string name = GetPropertyName(() => SomeClass.SomeProperty);
// Instance Property
string name = GetPropertyName(() => someObject.SomeProperty);
Teraz dzięki tej fajnej funkcji czas uprościć metodę ExposeProperty. Polerowanie klamek to niebezpieczna praca ...
Dziękuję wszystkim.