gre*_*b64 3 .net c# reflection attributes default-value
我有一个属性,(如下所示).
[DefaultValue(false)]
public bool MyProperty {
get {
return myVal;
}
set {
myVal=value;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用它的情况是确保它在PropertyGrid中显示为粗体,如果未设置默认值.
我觉得令人难以置信的是,在我的构造函数中,我必须设置我的属性的初始值,并希望它们匹配.
是否可以让我的构造函数"发现"给定属性的默认值,并相应地设置它?就像是:
myctor()
{
myVal = GetDefaultValueProperty<bool>("MyProperty");
}
Run Code Online (Sandbox Code Playgroud)
您可以使用以下代码获取您所追求的元数据.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想做一些非常酷的事情,可以使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
用法是:
myctor()
{
myVal = GetDefaultValue(x => x.MyProperty);
}
Run Code Online (Sandbox Code Playgroud)
您可以调用该GetProperty方法来查找属性,然后调用GetCustomAttributes(typeof(DefaultValueAttribute)(并转换其结果)以获取应用的属性。
| 归档时间: |
|
| 查看次数: |
4556 次 |
| 最近记录: |