我有一个如下的商业实体,
class Class1
{
List<Class2> classes = new List<Class2>();
public IEnumerable<Class2> Classes { get { return classes.AsEnumrable(); }
public void AddClass(Class2 cls)
{
classes.Add(cls);
}
}
class Class2
{
public string Property { get; set; }
}
我的业务逻辑要求,使用 AddClass
方法将 Class2
实例添加到 中的
,任何人都不能编辑之前添加到列表中的 Classes
列表的顶部Class1Class2
实例的属性,只能编辑列表中的最后一项。我该怎么做?
我尝试过 IReadOnlyList,但它似乎与使列表结构本身不可编辑而不阻止对其项目内容的编辑有关。
最佳答案
容器的职责不是决定其项目的行为。容器就是这样——一个包含其他对象的对象。 IReadOnlyList
是一个容器,其项目无法修改。但其中的项目只是 Class2
实例 - 容器无法阻止它们被编辑。
考虑一下:
myReadOnlyCollection[0].Property = "blah";
var firstItem = myReadOnlyCollection[0];
firstItem.Property = "blah";
这在您的场景中应该合法吗?两者有什么区别? firstItem
只是一个 Class2
的实例,它不知道它曾经位于只读集合中。
您需要的是 Class2 本身是不可变的。这取决于类,而不是容器。阅读不变性,这是一个需要掌握的重要概念,并相应地实现 Class2。如果您需要一个常规的、可变的 Class2
来更改其行为,也许可以向其添加一个 ToImmutable()
方法,该方法返回不同的项目,而不需要 setter。
关于c# - 将集合项目设置为只读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48733009/