C# 阻止公共列表属性添加项

C# 阻止公共列表属性添加项,c#,list,collections,C#,List,Collections,是否可以阻止IList类型的公共属性添加项。例如,我有一个简单的代码,它将一些实例存储在一个简单的列表中: class Program { private static IList<SomeItem> items = new List<SomeItem>(); static void Main(string[] args) { // That ok Items.Add(new SomeItem { OrderId

是否可以阻止
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();
        }
    }
}
类程序
{
私有静态IList项=新列表();
静态void Main(字符串[]参数)
{
//那好吗
Add(新的SomeItem{OrderId=0});
Add(newsomeitem{OrderId=1});
Add(newsomeitem{OrderId=2});
WriteLine(“金额:{0}”,items.Count);
//这是不可能的
Add(新的SomeItem{OrderId=3});
Add(新的SomeItem{OrderId=4});
WriteLine(“金额:{0}”,items.Count);
Console.ReadLine();
}
公共静态IList项目
{
得到
{
退货项目;
}
}
公共静态IList OrderedList
{
得到
{
return items.OrderBy(item=>item.OrderId.ToList();
}
}
}
我的API应该公开一些属性,这些属性返回一个有序项的列表(
OrderedList
)。这一切都很好,但不可能将项目添加到此列表中,因为它们不会存储在
项目中。我应该创建自己的只读列表还是缺少更好的解决方案。多谢各位

编辑

简而言之:这应该是不可能的:
OrderedList.Add(newsomeitem{OrderId=4})

如果无法添加
IList
,那实际上就是
IReadOnlyList

公共静态IReadOnlyList OrderedList{
得到{
//IList实现了IReadOnlyList,所以只需在这里返回列表
...
}
}
如果无法添加
IList
,那实际上就是
IReadOnlyList

公共静态IReadOnlyList OrderedList{
得到{
//IList实现了IReadOnlyList,所以只需在这里返回列表
...
}
}

我不想发布
IList
,而是建议将列表保留在内部,只发布
IReadOnlyList

公共静态IReadOnlyList OrderedList
{
得到
{
返回items.OrderBy(item=>item.OrderId).ToList().AsReadOnly();
}
}

您可以使用该方法创建列表的只读版本。这样,您将返回一个
ReadOnlyCollection
,因此调用者无法将属性值强制转换为
IList
。否则,调用方可以执行此强制转换并添加项

我不想发布
IList
,而是建议将列表保留在内部,只发布
IReadOnlyList

公共静态IReadOnlyList OrderedList
{
得到
{
返回items.OrderBy(item=>item.OrderId).ToList().AsReadOnly();
}
}

您可以使用该方法创建列表的只读版本。这样,您将返回一个
ReadOnlyCollection
,因此调用者无法将属性值强制转换为
IList
。否则,调用方可以执行此强制转换并添加项

谢谢大家!!如果我返回
IReadOnlyList
我不需要
.AsReadOnly()。但是当使用
var
时,它会很有帮助@本德请看我的最新编辑;如果执行
AsReadOnly()
操作,则返回一个ReadOnlyCollection;取决于您希望界面的安全程度。谢谢!如果我返回
IReadOnlyList
我不需要
.AsReadOnly()。但是当使用
var
时,它会很有帮助@本德请看我的最新编辑;如果执行
AsReadOnly()
操作,则返回一个ReadOnlyCollection;取决于您希望界面的安全程度。9分钟后。让我们等一下:)9分钟后。所以让我们等待:)
public static IReadOnlyList<SomeItem> OrderedList {  
  get {
    // IList<T> implements IReadOnlyList<T>, so just return List here
    ...
  }
}
public static IReadOnlyList<SomeItem> OrderedList
{
    get
    {
        return items.OrderBy(item => item.OrderId).ToList().AsReadOnly();
    }
}