#c# #reflection #mono #xamarin.ios
#c# #отражение #mono #xamarin.ios
Вопрос:
Использование C # и MonoTouch / Mono
Мне нужно получить имя свойства следующим образом:
public string BalanceOwing
{
get { return the-name-of-the-property "BalanceOwing" }
}
Комментарии:
1. Что? Нам понадобится больше контекста для того, что вы делаете. Что
the-name-of-the-property
должно означать? Вы хотите сказать, что хотите использовать отражение для получения значения свойства по имени? На каком объекте? и т.д.2. Где именно у вас возникли трудности? Неясно, чего вы пытаетесь достичь здесь.
3. Т.е. вы хотите получить имя свойства, в котором выполняется текущий код. Правильно ?!? Я действительно думаю, что это возможно только с помощью инструмента ориентированного на аспекты программирования (AOP), такого как PostSharp .
Ответ №1:
Самый простой подход здесь — это именно то, что у вас есть — базовый литерал "BalanceOwing"
.
infoof
Оператора нет. Есть несколько интересных способов сделать это внутри фреймворка с помощью деревьев выражений ( () => BalanceOwing
) или анализа стекового фрейма ( MethodInfo.GetCurrentMethod()
), но оба они влияют на производительность. Честно говоря, литерал проще, более прямой, быстрый и, пока вы его тестируете, такой же надежный.
Вы также можете посмотреть на внешние инструменты, такие как PostSharp (SharpCrafters), но опять же: здесь это звучит излишне.
Ответ №2:
Вы, конечно, можете создать повторно используемый метод, который предоставит вам то, что вам нужно.
protected String GetPropertyName<TProperty>(Expression<Func<TProperty>> propertyExpresion)
{
var property = propertyExpresion.Body as MemberExpression;
if (property == null || !(property.Member is PropertyInfo) ||
!IsPropertyOfThis(property))
{
throw new ArgumentException(string.Format(
CultureInfo.CurrentCulture,
"Expression must be of the form 'this.PropertyName'. Invalid expression '{0}'.",
propertyExpresion), "propertyExpression");
}
return property.Member.Name;
}
Для использования вы должны передать имя свойства…
String propertyName = GetPropertyName(() => this.BalanceOwing);
Как упоминалось Марком, это влияет на производительность (ничего из того, что мы формально сравнивали или отмечали на текущий момент), однако это хорошо подходит нашей команде при использовании INotifyPropertyChanged
поведения и создании строго типизированного присутствия в наших моделях / ViewModels.
Ответ №3:
Я бы предпочел избегать размышлений о свойствах, особенно если вы когда-либо ожидали сделать это более одного раза.
Мое общее мнение состоит в том, чтобы использовать атрибут поверх свойства, а затем кэшировать результат где-нибудь в статическом экземпляре:
[AttributeUsage(AttributeTargets.Property)]
public class FooNameAttribute : Attribute
{
public string PropertyName { get; private set; }
public FooNameAttribute(string propertyName)
{
PropertyName = propertyName;
}
}