C # Mono - Название недвижимости - PullRequest
1 голос
/ 31 октября 2011

Используя C # и MonoTouch / Mono

Мне нужно получить название свойства, например:

public string BalanceOwing
{
    get { return the-name-of-the-property "BalanceOwing" }
}

Ответы [ 3 ]

4 голосов
/ 31 октября 2011

Самый простой подход здесь - это именно то, что у вас есть - базовый литерал "BalanceOwing".

Нет оператора infoof. есть несколько интересных способов сделать это внутри фреймворка с помощью либо деревьев выражений (() => BalanceOwing), либо анализа стекового фрейма (MethodInfo.GetCurrentMethod()), но оба они оказывают влияние на производительность. Честно говоря, литерал проще, прямее, быстрее и до тех пор, пока вы его тестируете модулем - так же надежен.

Вы также можете посмотреть на внешние инструменты, такие как PostSharp (SharpCrafters), но опять же: здесь это звучит излишне.

2 голосов
/ 31 октября 2011

Вы, безусловно, можете создать метод многократного использования , который предоставит вам все, что вам нужно.

        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.

1 голос
/ 31 октября 2011

Я бы не стал размышлять о свойствах, особенно если вы когда-нибудь предполагали, что это будет сделано более одного раза.

В общих чертах я думаю использовать атрибут поверх свойства, а затем кэшировать результат в статическое состояние.экземпляр где-то:

[AttributeUsage(AttributeTargets.Property)]
public class FooNameAttribute : Attribute
{
    public string PropertyName { get; private set; }

    public FooNameAttribute(string propertyName)
    {
        PropertyName = propertyName;
    }
}
...