(Дивіться нижче рішення, яке я створив, використовуючи відповідь, яку я прийняв)
Я намагаюся покращити ремонтопридатність якогось коду, що включає рефлексію. У додатку є інтерфейс видалення .NET, що відкриває (серед іншого) метод, який називається Execute для доступу до частин програми, які не входять до його опублікованого віддаленого інтерфейсу.
Ось як додаток позначає властивості (статичні в цьому прикладі), які повинні бути доступні через Execute:
RemoteMgr.ExposeProperty("SomeSecret", typeof(SomeClass), "SomeProperty");
Тож віддалений користувач може зателефонувати:
string response = remoteObject.Execute("SomeSecret");
і додаток використовує відображення, щоб знайти SomeClass.SomeProperty і повернути його значення у вигляді рядка.
На жаль, якщо хтось перейменує SomeProperty і забуде змінити 3-ю парму ExposeProperty (), він порушує цей механізм.
Мені потрібно еквівалент:
SomeClass.SomeProperty.GetTheNameOfThisPropertyAsAString()
використовувати в якості 3-го парму в ExposeProperty, щоб інструменти рефакторингу дбали про перейменування.
Чи є спосіб це зробити? Заздалегідь спасибі.
Гаразд, ось що я в кінцевому підсумку створив (на основі відповіді, яку я вибрав, і питання, на який він посилався):
// <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;
}
Використання:
// Static Property
string name = GetPropertyName(() => SomeClass.SomeProperty);
// Instance Property
string name = GetPropertyName(() => someObject.SomeProperty);
Тепер з цією цікавою можливістю прийшов час спростити метод ExposeProperty. Полірування дверних ручок - небезпечна робота ...
Дякую всім.