gpt4 book ai didi

c# - 带有只读项的 ReadOnlyCollection

转载 作者:行者123 更新时间:2023-12-04 09:22:52 25 4
gpt4 key购买 nike

我有一个包含集合( Collection<MyItem> myItems )的类。我希望能够私下修改此 Collection 并通过公共(public)属性将其作为只读返回(如果可能,在 O(1) 中)。我正在考虑使用 ReadOnlyCollection ,但问题是项目( MyItem )不是只读的。所以我创建了一个只读包装类( ReadOnlyMyItem )。如何制作 ReadOnlyCollection通过方括号运算符返回包装类( ReadOnlyMyItem )而不再次构建整个集合,我希望一切都保持 O(1)。
我正在考虑创建一个派生自 ReadOnlyCollection 的新类( class ReadOnlyMyCollection : ReadOnlyCollection<MyItem> class ReadOnlyMyCollection : ReadOnlyCollection<ReadOnlyMyItem> )通过方括号运算符返回只读包装类( ReadOnlyMyItem ),但方括号运算符未标记为虚拟,返回类型为甚至不一样,或者构造函数没有 IList要使用的包装类 (IList<ReadOnlyMyItem>)。我应该从头开始构建类(class)(ReadOnlyMyCollection)吗?
代码看起来像这样:

public class MyClass
{
public ReadOnlyCollection<ReadOnlyMyItem> MyItems { get => GetMyItems(); }
private List<MyItem> myItems;
// ...

private ReadOnlyCollection<ReadOnlyMyItem> GetMyItems()
{
throw new NotImplementedException();
}
// ...
}

public class MyItem
{
// ...
}

public class ReadOnlyMyItem
{
private readonly MyItem myItem;
// ...

public ReadOnlyMyItem(MyItem myItem) => this.myItem = myItem;
// ...
}

最佳答案

你可以使用 IReadOnlyList<T> 吗?而不是 ReadOnlyCollection<T> ?IReadOnlyList<T>只提供count和索引运算符 [index] (和 IEnumerable<T> ),但如果这就是你所需要的,你可以写这样的东西:

public interface IReadOnlyMyItem
{
int SomeValue { get; }
}

public interface IWritableMyItem: IReadOnlyMyItem
{
new int SomeValue { get; set; } // Note use of `new`
}

public sealed class WriteableMyItem: IWritableMyItem
{
public int SomeValue { get; set; }
}

public sealed class MyClass
{
readonly List<WriteableMyItem> _items = new List<WriteableMyItem>();

public IReadOnlyList<IReadOnlyMyItem> MyItems() => _items;
}
请注意,我将接口(interface)拆分为 IReadOnlyMyItemIWritableMyItem但你实际上并不需要 IWritableMyItem - 您可以省略该接口(interface)并编写:
public sealed class WriteableMyItem: IReadOnlyMyItem
{
public int SomeValue { get; set; }
}
反而。我刚刚包括 IWritableMyItem为了完整性(因为它显示了如何通过使用 setget 引入只有 new 的接口(interface)属性)。
根据下面的评论,您可以通过制作 IWriteableMyItem 来防止向下转换的可能性。和 WriteableMyItem私有(private)或内部。但是请注意,这仍然可以通过反射来规避 - 但我们正在防止事故而不是欺诈。

关于c# - 带有只读项的 ReadOnlyCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63068616/

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