-1

我正在使用流利的验证 API 来编写验证。

我在课堂上遇到了一处internal set房产ValidationContext

public class ValidationContext {
        public Dictionary<string, object> RootContextData { get; internal set; } = new Dictionary<string, object>();
}

我在这个问题中遇到了内部设置属性。所以,我可以像这样设置字典的值

var rowItemContext = new ValidationContext();
rowItemContext.RootContextData.Add("ab", new object());//this works

上面的代码将一个项目添加到RootcontextData作品中。

但是以下将另一个字典直接分配给 RootContextData 的行会导致编译时错误。

无法将属性或索引器“ValidationContext.RootContextData”分配给——它是只读的

rowItemContext.RootContextData = new Dictionary<string, object>()
            {
                { "ab", new object() }
            };

因此,要将项目字典添加到上下文数据中,我必须遍历要添加的字典。我很惊讶为什么第一个有效但不是直接分配。

4

2 回答 2

1

您似乎对什么是“设置”属性感到困惑。

通常,您仅set在使用该=标志时才对物业进行标记。当您使用赋值运算符时,您实际上是在为属性赋予一个新值。

Dictionary是引用类型,因此该属性存储对字典对象的引用。在这种情况下,属性的值是指向字典的引用。

当您调用 时Add,您只是在修改字典对象,而不是属性的值。该属性的值仍然指向同一个字典对象,因此它保持不变。

当您使用=并创建新字典时,您试图将存储在属性中的引用更改为其他引用。这算作set财产,所以你不能这样做。

于 2018-06-11T11:12:56.980 回答
0

有几个时刻:

  1. 您使用内部集,因此您只能在程序集中设置属性。另请参阅:c# 中的内部设置属性是什么?
  2. 在第二种情况下,您使用Collection Initializer。它使用新值设置属性(用 key"ab"和 value初始化的新字典new object()
  3. 如果您遇到这样的异常,您尝试在程序集之外执行此操作。使用Add方法。
  4. 从设计的角度来看:不要使用可以改变对象内部状态的公共属性。封装它。
于 2018-06-18T06:31:40.800 回答