Получить значение по умолчанию свойства с учетом его имени - PullRequest
3 голосов
/ 20 мая 2011

У меня есть свойство (пример показан ниже).

 [DefaultValue(false)]
 public bool MyProperty {
    get {
       return myVal;
    }
    set {
       myVal=value;
    }
 }

Я использую эту ситуацию, чтобы убедиться, что оно отображается как полужирный в PropertyGrid, еслизначение по умолчанию не установлено.

Я нахожу невероятно раздражающим, что в моем конструкторе я должен установить начальное значение моего свойства и надеюсь, что они совпадают.

Возможно ли эточтобы мой конструктор "открыл" значение по умолчанию для данного свойства и установил его соответствующим образом?Что-то вроде:

myctor()
{
   myVal = GetDefaultValueProperty<bool>("MyProperty");
}

Ответы [ 2 ]

5 голосов
/ 20 мая 2011

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

public static T GetDefaultValue<T>(string propertyName)
{
    var property = typeof(MyClass).GetProperty(propertyName);

    var attribute = property
        .GetCustomAttribute(typeof(DefaultValueAttribute)) 
            as DefaultValueAttribute;

    if(attribute != null)
    {
        return (T)attribute.Value;
    }
}

Если вы хотите что-то сделать действительно круто, вы можете сделать это с помощьюлямбда-выражение:

public static T GetDefaultValue<T>(
    Expression<Func<T, MyClass>> propertySelector)
{
    MemberExpression memberExpression = null;

    switch (expression.Body.NodeType)
    {
        case ExpressionType.MemberAccess:
            // This is the default case where the 
            // expression is simply member access.
            memberExpression 
                = expression.Body as MemberExpression;
            break;

        case ExpressionType.Convert:
            // This case deals with conversions that 
            // may have occured due to typing.
            UnaryExpression unaryExpression 
                = expression.Body as UnaryExpression;

            if (unaryExpression != null)
            {
                memberExpression 
                    = unaryExpression.Operand as MemberExpression;
            }
            break;
    }


    MemberInfo member = memberExpression.Member;

    // Check for field and property types. 
    // All other types are not supported by attribute model.
    switch (member.MemberType)
    {
        case MemberTypes.Property:
            break;
        default:
            throw new Exception("Member is not property");
    }

    var property = (PropertyInfo)member;

    var attribute = property
        .GetCustomAttribute(typeof(DefaultValueAttribute)) 
            as DefaultValueAttribute;

    if(attribute != null)
    {
        return (T)attribute.Value;
    }
}

Тогда используется:

myctor()
{
   myVal = GetDefaultValue(x => x.MyProperty);
}
4 голосов
/ 20 мая 2011

Вы можете вызвать метод GetProperty, чтобы найти свойство, затем вызвать GetCustomAttributes(typeof(DefaultValueAttribute) (и привести его результат), чтобы применить атрибут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...