阻止公共列表属性添加项目

时间:2015-11-16 12:57:55

标签: 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 = 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 });

2 个答案:

答案 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>。否则,调用者可以执行此操作并添加项目。