2011-05-20 210 views
3

我有一個屬性(示例如下所示)。獲取屬性名稱的默認值

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

的情況我使用這是爲了確保它表現爲在一個PropertyGrid中大膽如果默認值未設置。

我發現它令人難以置信的煩惱,在我的構造函數中,我必須設置我的屬性的初始值,並希望它們匹配。

是否有可能讓我的構造函數「發現」給定屬性的默認值,並相應地設置它?喜歡的東西:

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

回答

5

您可以使用下面的代碼來獲取您之後的元數據。

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; 
    } 
} 

如果你想要做的事真的很酷,你可以用一個Lambda表達式做到這一點:

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

可以調用GetProperty方法找物業,然後調用GetCustomAttributes(typeof(DefaultValueAttribute)(投下它的結果),以獲得應用的屬性。