gpt4 book ai didi

c# - 使具有公共(public)属性的对象列表/集合真正只读

转载 作者:行者123 更新时间:2023-11-30 14:53:14 25 4
gpt4 key购买 nike

我有以下问题。

假设有一个 public Class1 定义如下:

public class Class1
{
public string pr1 { get; set; }
public string pr2 { get; set; }

public Class1()
{
}
}

我不允许修改类定义 - 它被其他人使用,他们需要这样写。麻烦来了。

我需要 static List<Class1> myStaticList它只能在 Class2 内部修改,其他任何地方都是真正只读的。我所说的“真正只读”是指用户不得更改任何内容,包括列表元素的属性。

类似于:Class2.list[0].pr1="newValue"应阻止从 Class2 外部调用。

ReadOnlyCollection不要做任何工作,因为用户仍然可以修改列表的给定元素,所以这里给出了解决方案 List<T> readonly with a private set不能满足我的需求。

基本上我已经找到了很多使列表/集合成为只读的可能方法(例如 IReadOnlyList ),但如果它们具有公共(public) setter ,所有这些方法都可能改变给定列表元素的属性。

我找到的唯一解决方案是创建新类:

public class Class1ReadOnly : Class1
{
public new string pr1{ get; private set; }
public new string pr2{ get; private set; }
public Class1ReadOnly(Class1 tmp)
{
pr1= tmp.pr1;
pr2 = tmp.pr2;
}
}

但我希望两个人能找到更好的方法,因为在我看来,仅仅因为一个只读列表就定义一个全新的类有点奇怪

提前感谢您提供任何线索。

这甚至可以用这种不同的方式吗?


现实世界的上下文是这样的:

在代码中,我们编辑数据库,我想要备份已更改为初始值的记录列表。我想让它保持静态只是为了有可能在我想要的任何地方恢复数据库。 Class1 包含我们数据库的单个记录的所有值,因此 List<Class1>我可以保留所有修改过的记录并在需要时恢复它们。由于它是备份,因此必须是只读的,因为意外的更改可能会导致灾难。

最佳答案

“我不允许更改它”是指(如问题措辞所暗示的)不允许您修改类中的值吗?或者您实际上不允许修改类声明本身?另外,如果不允许修改类声明,那么在集合中使用该类的代码怎么办?例如。会 List<Class1>要求对象继续是 List<Class1> , 或者你能更换 Class1用别的东西打字?


没有更多的上下文,很难确定什么是最适合你的情况。但是,一种可能的方法是 Class1被接口(interface)替换:

interface IClass1
{
string str1 { get; }
string str2 { get; }
}

然后声明Class1作为实现该接口(interface),嵌套在 Class2 中:

class Class2
{
private class Class1 : IClass1
{
public string str1 { get; set; }
public string str2 { get; set; }
}
}

现在,使用您已经看到的使列表本身变为只读的技术,您可以防止任何其他代码替换列表中的元素(即使用接口(interface)的某些其他实现) .而且只有Class2可以成功投执行 IClass1列表中的元素到 Class1访问属性的公共(public) setter 。

如果这不能解决您的顾虑,那么如果您能更具体地说明解决问题的确切限制条件会有所帮助。

关于c# - 使具有公共(public)属性的对象列表/集合真正只读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29960129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com