(см ниже решения я создал с помощью ответа я принял)Получить имя имущества в виде строки
Я пытаюсь улучшить ремонтопригодность некоторого кода с участием отражения. Приложение имеет интерфейс .NET Remoting, который предоставляет (среди прочего) метод, называемый 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. Полировка дверных ручек - опасная работа ...
Спасибо всем.
Ее действительно appriciated, что вы добавили раствор и привязанные вещи. –
Возможный дубликат [Получить имя и тип свойства с использованием выражения лямбда] (http://stackoverflow.com/questions/273941/get-property-name-and-type-using-lambda-expression) – nawfal
Вы должны добавить свое решение как ответ - это гораздо более краткий, чем ответ, который вы приняли. –