我在模型中有一个属性,它具有auto属性getter和setter:
[DataMember]
public Collection<DTOObjects> CollectionName { get; set; }
构建解决方案时出现以下错误:
Microsoft.Usage:通过删除属性设置器将“propertyname”更改为只读。
但是,当我删除setter并运行代码时,会发生错误,因为它正在尝试设置属性!它似乎要求我删除setter,尽管它被设置在代码中的某处。
有没有其他人遇到这个问题?我需要修改什么?
答案 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"));