【问题标题】:How to get the default value of an object property? [duplicate]如何获取对象属性的默认值? [复制]
【发布时间】:2011-01-17 08:46:40
【问题描述】:

一些代码:

foreach (System.Reflection.PropertyInfo pi in myObject.GetType().GetProperties())
{
    if (pi.CanWrite)
    {
        object value = pi.GetValue(Properties, null);

        // if (value is not default)
        // {
        X.addAttribute(pi.Name, value);
        // }
    }
}

如果属性处于其默认值,我正在尝试做的不是调用“X.addAttribute...”行。我假设有某种方法可以获取属性的 DefaultValue,以便我可以进行比较?

出于我的目的,我试图获取 DefaultValueAttribute 定义的“默认”值。

感谢您的帮助,干杯。

【问题讨论】:

  • 答案将取决于您如何定义“默认值”。两个明显的定义是 CLR-Default(null 用于引用类型,0 用于值类型)或 DefaultValueAttribute。您能否编辑您的问题以阐明您对哪个感兴趣?
  • 嗨,抱歉;我应该指定的。它是通过 DefaultValueAttribute 定义的默认值。

标签: c# default propertyinfo


【解决方案1】:

下面是我用来获取任何 runtime-type 的默认值的方法,它将为非值类型返回“null”,否则它将返回默认值类型(它包括缓存值额外性能的类型):

private static readonly Dictionary<Type, object> DefaultValueTypes 
    = new Dictionary<Type, object>();

public static object GetDefaultValue(Type type)
{
    if (!type.IsValueType) return null;

    object defaultValue;
    lock (DefaultValueTypes)
    {
        if (!DefaultValueTypes.TryGetValue(type, out defaultValue))
        {
            defaultValue = Activator.CreateInstance(type);
            DefaultValueTypes[type] = defaultValue;
        }
    } 

    return defaultValue;
}

【讨论】:

  • 谢谢,但我的系统使用了一些非值类型。无论如何,这是一个方便的代码:)。
  • 或者,如果类型在编译时已知,则可以使用 default 关键字。
  • 这正是我想要的!谢谢!
【解决方案2】:

假设您正在尝试获取 DefaultValue 属性,请在您的 PropertyInfo 对象上使用 GetCustomAttributes

【讨论】:

  • 干杯。这是我需要的一些信息。
【解决方案3】:

首先,您必须始终使用您想要的默认值初始化该字段。

类似的东西

    class UnitManager
    {
      private int value;

      [DefaultValue("0")]
      public int Value
      {
       get { return this.value; }
       set { this.value = value; } 
      }
    } 

然后简单地使用

    UnitManager manager = new UnitManager()

    int startValue = manager.Value;

【讨论】:

    猜你喜欢
    • 2013-02-02
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 2021-05-13
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    相关资源
    最近更新 更多