2015-11-16 8 views
0

Можно ли запретить публичное свойство типа 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. Должен ли я создать свой собственный список только для чтения или мне не хватает лучшего решения. Большое спасибо!

EDIT

Короче говоря: это не должно быть возможно: OrderedList.Add(new SomeItem { OrderId = 4 });

ответ

3

Если IList<T> не могут быть добавлены, что это на самом деле IReadOnlyList<T>:

public static IReadOnlyList<SomeItem> OrderedList { 
    get { 
    // IList<T> implements IReadOnlyList<T>, so just return List here 
    ... 
    } 
} 
+0

Отлично, спасибо. +1 – BendEg

+0

Не только +1. Это должно быть отмечено как ответ. – niksofteng

+0

Через 9 минут. Итак, давайте подождем :) – BendEg

1

Вместо публикации IList<T> , Я бы предложил сохранить список и опубликовать только IReadOnlyList<T>:

public static IReadOnlyList<SomeItem> OrderedList 
{ 
    get 
    { 
     return items.OrderBy(item => item.OrderId).ToList().AsReadOnly(); 
    } 
} 

Вы можете использовать метод AsReadOnly, чтобы создать версию вашего списка только для чтения. Таким образом, вы возвращаете ReadOnlyCollection<T>, чтобы вызывающий абонент не смог присвоить значение свойства IList<T>. В противном случае вызывающий может сделать это приведение и добавление элементов тем не менее.

+0

Спасибо! Если я возвращаю 'IReadOnlyList', мне не нужно' .AsReadOnly(); '. Но при использовании 'var' это будет полезно! – BendEg

+1

@BendEg, пожалуйста, просмотрите мое последнее изменение; если вы выполняете 'AsReadOnly()', вы возвращаете ReadOnlyCollection; зависит от того, насколько безопасным будет ваш интерфейс. – Markus

Смежные вопросы