c# - 将集合项目设置为只读

标签 c# readonly-collection

我有一个如下的商业实体,

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 列表的顶部Class1,任何人都不能编辑之前添加到列表中的 Class2 实例的属性,只能编辑列表中的最后一项。我该怎么做?

我尝试过 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/

相关文章:

c# - 我在 ASP.net core MVC 和 Azure iot hub 中遇到错误

c# - 如何使用 Expression 调用带有实例的方法

c# - 只读列表列表 c#

c# - ReadonlyCollection,对象是不可变的吗?

c# - 没有添加的公共(public)列表

C# SecuGen 加载回指纹图像进行验证

c# - 命名管道 C# 客户端无法连接到 C++ 服务器

c# - 从 C# 通过 Hive ODBC 连接到 Hadoop

c# - 对 IReadOnlyCollection 的隐式/显式转换混淆

typescript - 为什么我不能在 TypeScript 中以这种方式创建只读数组?