You can use the following code to get the metadata you are after.
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:
memberExpression
= expression.Body as MemberExpression;
break;
case ExpressionType.Convert:
UnaryExpression unaryExpression
= expression.Body as UnaryExpression;
if (unaryExpression != null)
{
memberExpression
= unaryExpression.Operand as MemberExpression;
}
break;
}
MemberInfo member = memberExpression.Member;
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);
}