2011-05-20 211 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)(投下它的结果),以获得应用的属性。