gpt4 book ai didi

c# - 获取给定名称的属性的默认值

转载 作者:行者123 更新时间:2023-11-30 13:41:04 27 4
gpt4 key购买 nike

我有一个属性(property),(示例如下所示)。

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

如果未设置默认值,我使用它的情况是确保它在 PropertyGrid 中显示为粗体

我发现在我的构造函数中,我必须设置我的属性的初始值,并希望它们匹配,这非常烦人。

是否可以让我的构造函数“发现”给定属性的默认值,并相应地设置它?像这样的东西:

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

最佳答案

您可以使用以下代码获取您想要的元数据。

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

关于c# - 获取给定名称的属性的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6074055/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com