13

我在具有自动属性 ​​getter 和 setter 的模型中有一个属性:

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

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

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

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

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

4

4 回答 4

12

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

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

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

发生错误,因为它试图设置属性

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

于 2012-10-26T08:57:38.813 回答
0

只需抑制它,右键单击错误并单击代码中的抑制 & 一个属性将添加到属性中。

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

于 2012-10-26T08:57:29.527 回答
0

从文档:

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

如果它不是 DTO 的一部分:

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

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

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

于 2020-03-26T04:02:43.363 回答
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"));
于 2020-10-21T19:11:49.670 回答