【问题标题】:DefaultValue attribute is not working with my Auto PropertyDefaultValue 属性不适用于我的自动属性
【发布时间】:2010-12-31 03:11:00
【问题描述】:

我有以下自动属性

[DefaultValue(true)]
public bool RetrieveAllInfo { get; set; }

当我尝试在代码中使用它时,我发现默认的 false 是 false 我假设这是 bool 变量的默认值,有没有人知道出了什么问题!?

【问题讨论】:

  • Similar question。在 VS2015 中:public bool RetrieveAllInfo { get; set; } = true; 这是C# 6 功能。

标签: c# properties attributes default-value automatic-properties


【解决方案1】:

DefaultValue 属性仅用于告诉 Visual Studio 设计者(例如在设计表单时)属性的默认值是什么。它不会在代码中设置属性的实际默认值。

更多信息在这里:http://support.microsoft.com/kb/311339

【讨论】:

  • 谢谢菲利普,所以我认为唯一的解决方案是来自构造函数。谢谢
【解决方案2】:

[DefaultValue] 仅由(例如)序列化 API(如 XmlSerializer)和一些 UI 元素(如 PropertyGrid)使用。它不设置值本身;您必须为此使用构造函数:

public MyType()
{
    RetrieveAllInfo = true;
}

或手动设置字段,即不使用自动实现的属性:

private bool retrieveAllInfo = true;
[DefaultValue(true)]
public bool RetrieveAllInfo {
    get {return retrieveAllInfo; }
    set {retrieveAllInfo = value; }
}

或者,使用更新的 C# 版本(C# 6 或更高版本):

[DefaultValue(true)]
public bool RetrieveAllInfo { get; set; } = true;

【讨论】:

  • 你好它的老问题。但是现在只使用自动实现的属性的代码生成是否安全?并删除retreiveAllInfo 字段?我的意思是直接public bool RetreiveAllInfo {get;set;} = true?为什么我仍然看到大多数 UI 库都使用旧方式。
  • @KOGRA“是的,没关系”和“因为就像这个答案:它们是在不存在该语法时编写的”(这是 C# 6 中的“自动属性初始化器”功能)
【解决方案3】:

this 链接上的一个技巧。

简而言之,在构造函数的末尾调用这个函数。

static public void ApplyDefaultValues(object self)
   {
        foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(self)) {
            DefaultValueAttribute attr = prop.Attributes[typeof(DefaultValueAttribute)] as DefaultValueAttribute;
            if (attr == null) continue;
            prop.SetValue(self, attr.Value);
        }
   }

【讨论】:

  • 这是危险的,不应使用。这会在基类构造函数完成之前设置派生类的属性,在派生类有机会设置使属性设置器工作所需的任何内容之前。
猜你喜欢
  • 2021-11-09
  • 2010-10-25
  • 2011-01-20
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 2018-03-06
相关资源
最近更新 更多