Запретить доступ к элементам списка из внешнего класса c# - PullRequest
3 голосов
/ 19 июня 2020

Как то, что могло бы быть продолжением этого вопроса.

Я столкнулся с необходимостью иметь список класса List<Foo>, где я хотел бы ограничить доступ к элементам списка, но не доступа к списку в целом, так что я могу получить / установить весь список, но не получить / установить какой-либо из его элементов.

Проблема в том, что тип элементы списка должны быть классом publi c со всеми его членами (которые являются свойствами) publi c из-за сериализации элементов списка.

Есть ли способ реализовать это?

Заранее спасибо

Изменить:

Я пробовал это:

public class SomeClass()
{
    private List<string> someList;
    public IList<string> SomeList { 
        get { return someList.AsReadOnly(); }
    }
}

И проверил, может ли быть какой-либо метод, который удовлетворяет мою потребность, например get { return someList.AsWholeListGettable&SettableOnly(); } или get { return someList.AsNoAccessibleElementsList(); }

. Я также попробовал перегрузку оператора [], чтобы попытаться сделать оператор индекса частным. (Такое же поведение для массива также будет приемлемым).

class SampleCollection<T>
{
    // Declare an array to store the data elements.
    private T[] arr = new T[100];

    // Define the indexer to allow client code to use [] notation.
    private T this[int i]
    {
        private get { return arr[i]; }
        private set { arr[i] = value; }
    }
}

как в здесь .

Так что извне члены класса не будут доступны. Но я получаю эту ошибку:

enter image description here

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Святой курит, выкладываю ответ на случай, если он кому-нибудь пригодится. Установка свойства индекса как частного ведет себя так, как мне нужно:

    class SampleCollection<T> {
        // Declare an array to store the data elements.
        private T[] arr = new T[100];

        // Define the indexer to allow client code to use [] notation.
        private T this[int i] {
            get { return arr[i]; }
            set { arr[i] = value; }
        }
    }

Моя проблема заключалась в том, что я дважды устанавливал частное свойство и средство доступа, поэтому я получал ошибку. Ниже кода, вызывающего ошибку:

    private T this[int i]
    {
        private get { return arr[i]; }
        private set { arr[i] = value; }
    }

Установив свойство index private, вы блокируете доступ к индексу списка, поэтому элементы не могут быть получены или установлены, и вы можете обрабатывать всю массовую обработку элементов списка другими методами. Это то, что я хотел.

1 голос
/ 19 июня 2020

Если вы не хотите настраивать значения свойств содержимого списка, у вас есть 2 варианта:

1) использовать неизменяемые элементы, например:

public class YourElementType
{
    private readonly string _bar;
    public YourElementType(string bar)
    {
        _bar = bar;
    } 

    //no set, so no change
    public string Bar get { return _bar}
}

2) вернуть копию объектов при возврате списка. Сами копии объектов являются изменяемыми, исходный список не будет.

public class SomeClass()
{
    private List<YourElementType> someList;

    public IList<YourElementType> SomeList { 
        get 
        { 
            return someList.Select(t => new YourElementType() 
            {
                // ...initialize to create a copy
            }).ToList().AsReadOnly(); 
         }
    }
}

Обратите внимание: это дорого в памяти и производительности процессора.


Как видно из вашего комментария, Кажется, вам нужно что-то вроде:


public class SomeClass()
{
    private List<YourElementType> someList;

    public IEnumerable<YourElementType> SomeEnumertor { 
        get 
        { 
            return someList.AsIEnumerable(); 
         }
    }
}

Вы можете oop это в foreach, но SomeEnumertor[0] невозможно. Пользователь мог снова обернуть его светящейся кстати.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...