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

C# 获取给定名称的属性的默认值,c#,.net,reflection,attributes,default-value,C#,.net,Reflection,Attributes,Default Value,我有一个属性(示例如下所示) 我使用它的情况是,如果未设置默认值,则确保它在a PropertyGrid中显示为bold 在我的构造函数中,我必须设置属性的初始值,并希望它们匹配,这让我感到非常恼火 是否可以让我的构造函数“发现”给定属性的默认值,并相应地进行设置?比如: myctor() { myVal = GetDefaultValueProperty<bool>("MyProperty"); } myctor() { myVal=GetDefaultValuePrope

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

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

在我的构造函数中,我必须设置属性的初始值,并希望它们匹配,这让我感到非常恼火

是否可以让我的构造函数“发现”给定属性的默认值,并相应地进行设置?比如:

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

您可以调用
GetProperty
方法来查找属性,然后调用
GetCustomAttributes(typeof(DefaultValueAttribute)
(并强制转换其结果)来应用属性。

您可以使用以下代码来获取所需的元数据

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

这是一个基于Paul Turner答案的通用扩展方法。它适用于任何类的任何成员

public static bool TryGetDefaultValue<TSource, TResult>(this TSource _, Expression<Func<TSource, TResult>> expression, out TResult result)
{
    if (((MemberExpression)expression.Body).Member.GetCustomAttribute(typeof(DefaultValueAttribute)) is DefaultValueAttribute attribute)
    {
        result = (TResult)attribute.Value;
        return true;
    }

    result = default;
    return false;
}
public static bool TryGetDefaultValue(此TSource u2;,表达式,out TResult结果)
{
如果(((MemberExpression)expression.Body.Member.GetCustomAttribute(typeof(DefaultValueAttribute))是DefaultValueAttribute属性)
{
结果=(TResult)attribute.Value;
返回true;
}
结果=默认值;
返回false;
}
或者,如果未找到属性,则可以返回默认值,请使用以下命令:

public static TResult GetDefaultValue<TSource, TResult>(this TSource _, Expression<Func<TSource, TResult>> expression)
{
    if (((MemberExpression)expression.Body).Member.GetCustomAttribute(typeof(DefaultValueAttribute)) is DefaultValueAttribute attribute)
    {
        return (TResult)attribute.Value;
    }

    return default;
}
public static TResult GetDefaultValue(此TSource),表达式)
{
如果(((MemberExpression)expression.Body.Member.GetCustomAttribute(typeof(DefaultValueAttribute))是DefaultValueAttribute属性)
{
返回(TResult)attribute.Value;
}
返回默认值;
}
您还可以修改它,以便在未找到该属性时引发异常

myctor()
{
   myVal = GetDefaultValue(x => x.MyProperty);
}
public static bool TryGetDefaultValue<TSource, TResult>(this TSource _, Expression<Func<TSource, TResult>> expression, out TResult result)
{
    if (((MemberExpression)expression.Body).Member.GetCustomAttribute(typeof(DefaultValueAttribute)) is DefaultValueAttribute attribute)
    {
        result = (TResult)attribute.Value;
        return true;
    }

    result = default;
    return false;
}
public static TResult GetDefaultValue<TSource, TResult>(this TSource _, Expression<Func<TSource, TResult>> expression)
{
    if (((MemberExpression)expression.Body).Member.GetCustomAttribute(typeof(DefaultValueAttribute)) is DefaultValueAttribute attribute)
    {
        return (TResult)attribute.Value;
    }

    return default;
}