是否可以阻止IList<>
类型的公共属性添加项目。例如,我有这个简单的代码,它将一些实例存储在一个简单的列表中:
class Program
{
private static IList<SomeItem> items = new List<SomeItem>();
static void Main(string[] args)
{
// That ok
Items.Add(new SomeItem { OrderId = 0 });
Items.Add(new SomeItem { OrderId = 1 });
Items.Add(new SomeItem { OrderId = 2 });
Console.WriteLine("Amount: {0}", items.Count);
// This should not be possible
OrderedList.Add(new SomeItem { OrderId = 3 });
OrderedList.Add(new SomeItem { OrderId = 4 });
Console.WriteLine("Amount: {0}", items.Count);
Console.ReadLine();
}
public static IList<SomeItem> Items
{
get
{
return items;
}
}
public static IList<SomeItem> OrderedList
{
get
{
return items.OrderBy(item => item.OrderId).ToList();
}
}
}
我的API应该公开一些属性,该属性返回有序项目列表(OrderedList
)。这一切都很好,但是不应该将项目添加到此列表中,因为它们不会存储在items
中。我应该创建自己的只读列表还是我错过了一些更好的解决方案。非常感谢你!
修改
简而言之:这不可能:OrderedList.Add(new SomeItem { OrderId = 4 });
答案 0 :(得分:3)
如果无法添加IList<T>
,那实际上就是IReadOnlyList<T>
:
public static IReadOnlyList<SomeItem> OrderedList {
get {
// IList<T> implements IReadOnlyList<T>, so just return List here
...
}
}
答案 1 :(得分:1)
我建议不要发布IList<T>
,而是将列表保留在内部,只发布IReadOnlyList<T>
:
public static IReadOnlyList<SomeItem> OrderedList
{
get
{
return items.OrderBy(item => item.OrderId).ToList().AsReadOnly();
}
}
您可以使用AsReadOnly方法创建列表的只读版本。这样,您返回ReadOnlyCollection<T>
,以便调用者无法将属性值强制转换为IList<T>
。否则,调用者可以执行此操作并添加项目。