Предоставление свойства только для чтения, которое может быть изменено внутри - PullRequest
0 голосов
/ 29 октября 2009

Я создаю класс, в котором будут размещаться результаты выборов. У меня есть класс результатов, который имеет статический метод, который будет анализировать файл и возвращать класс результатов с результатами из файла.

Я хочу убедиться, что только статический метод может изменять результаты, поэтому я использовал внутренний модификатор (Precinct.InternalCandidates) (препятствует доступу методов к экземплярам моего класса за пределами dll, верно? ).

В любом случае, мне нужно выставить кандидатов в виде списка только для чтения для экземпляра моего класса, в который был создан экземпляр, но, очевидно, мне нужно будет добавить кандидатов во время процесса заполнения. Итак, я создал еще один параметр в классе Precinct под названием Precinct.Candidates, который предоставляет версию InternalCandidates только для чтения

Вот как я могу представить, как это работает:

Results r = Results.ParseResultsFile("PathToFile.txt");
r.Candidates.Add(new Candidate) // Should error here
Console.WriteLine(r.Candidates[0].Name) // Should work

Вот что у меня есть для окурков моего класса:

public class Results {
  private List<Precinct> precincts = new List<Precinct>();
   public ReadOnlyCollection<Precinct> Precincts {
      get { return this.precincts.AsReadOnly(); }
  }

  public Results() {}

  public static Results ParseResultsFile(string filePath) { ... }
}

public class Precinct {
  internal List<Contest> InternalContests { get; set; }
  public ReadOnlyCollection<Contest> Contests {
    get { return this.InternalContests.AsReadOnly(); }
  }
  public Precinct {
    this.InternalContests = new List<Contest>();
  }
}

Есть ли лучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 29 октября 2009

Боюсь, у меня есть немного плохих новостей, Роб ... используя Reflection, можно полностью обойти модификаторы доступа. Они помогают защитить команду от самих себя, но не подходят для обеспечения безопасности.

Вам нужно будет обеспечить физическую безопасность кода и убедиться, что никто не сможет загрузить вашу DLL в домен приложения своего собственного создания.

UPDATE:

Я исправлюсь самостоятельно. Вы можете установить атрибут, который предотвращает отражение, если вызывающий не имеет полного доверия (обновление от Леппи). Посмотрите, как .

Вы можете запретить вызывающим абонентам без полного доверия доступ к вашим закрытым / внутренним методам и полям, но нельзя запретить вызывающему абоненту с полным доверием использовать отражение.

0 голосов
/ 27 июня 2011

Снова. Убираю мои старые вопросы ... В итоге я просто перевела свою собственную коллекцию.

Отлично сработало ..

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