如何修复“删除属性设置器”构建错误?

时间:2012-10-26 08:54:50

标签: c# asp.net-mvc

我在模型中有一个属性,它具有auto属性getter和setter:

[DataMember]
public Collection<DTOObjects> CollectionName { get; set; }

构建解决方案时出现以下错误:

  

Microsoft.Usage:通过删除属性设置器将“propertyname”更改为只读。

但是,当我删除setter并运行代码时,会发生错误,因为它正在尝试设置属性!它似乎要求我删除setter,尽管它被设置在代码中的某处。

有没有其他人遇到这个问题?我需要修改什么?

4 个答案:

答案 0 :(得分:6)

我猜这是一个列表/集合(或类似的东西),在这种情况下是 - 有一个setter是不寻常的。一个典型的例子可能是:

private readonly List<Foo> items = new List<Foo>();
public List<Foo> Items { get { return items; } }

大多数来电者不应该尝试分配给他们;他们不应该需要 - 他们可以添加/删除/枚举/清除/等列表,而无需分配它。

  

发生错误,因为它正在尝试设置属性

然后考虑更改该代码,使其尝试设置该属性。几乎在所有情况下都不应该

答案 1 :(得分:0)

只需按住它,右键单击错误,然后点击代码中的抑制&amp;属性将被添加到属性中。

通常,您不应该为集合设置公共集,因为这允许替换列表,但是对于在运行时创建或反序列化的对象,有时需要使用公共setter。

答案 2 :(得分:0)

从文档中

“如果该属性是数据传输对象(DTO)类的一部分,则可以禁止显示警告。否则,请不要禁止此规则显示警告。”

如果它不是DTO的一部分:

“要解决违反此规则的问题,请将属性设置为只读。如果设计需要,请添加方法以清除并重新填充集合。”

替换只读集合属性的首选方法是使用Clear和AddRange方法(或其等效方法)。

https://docs.microsoft.com/en-us/visualstudio/code-quality/ca2227?view=vs-2019

答案 3 :(得分:0)

一种解决方案是在构造函数中初始化Collection ...

public class Email
{
    public Email() 
    {
        To = new List<MailAddress>();
    }

    ....

    public List<MailAddress> To { get; }
}

然后只需在代码中使用.add:

   Email oEmail = new Email();
   oEmail.To.Add(new MailAddress("Foo@fighter.com", "Mr. Foo"));