Как отметить элементы, которые требуются во время выполнения, но не должны использоваться в коде? - PullRequest
2 голосов
/ 04 февраля 2011

Иногда среда .NET требует от нас создания открытых сеттеров для свойств, которые действительно должны быть доступны только для чтения.Например:

  1. XmlSerializer требует, чтобы сериализованные свойства были доступны для записи, даже если мы сериализуем только односторонние.внутри MultiBinding, хотя концептуально связанное значение никогда не изменится.Это требует, чтобы свойства были доступны для записи.

В каждом из этих случаев я могу оставить установщик пустым, не влияя на функциональность, но это может привести к путанице.

Учитывая то, что я не могу избежать использования открытых сеттеров для этих свойств, есть ли способ генерировать предупреждения компилятора при доступе к сеттерам?Атрибуты [Deprecated] и [Obsolete] выполнят эту работу, но формулировка / намерение неверны.

Ответы [ 2 ]

5 голосов
/ 04 февраля 2011

Способ, которым я подхожу к этой проблеме, заключается в том, что я просто не ставлю под угрозу целостность моих типов для целей сериализации.Процесс сериализации все о данных и очень мало о поведении.Я отказываюсь ставить под угрозу поведение моих типов только для сценария с данными.

Вместо этого я разрабатываю свои типы для наиболее эффективного + безопасного использования.Если результирующий тип не сериализуем и я нахожу сценарий, который требует этого, я создам отдельные типы, которые существуют исключительно для сериализации моих других типов.

Вот краткий пример.

// My Core Immutable Type
namespace MyProject {
  public sealed class Student { 
    private readonly string _name;
    public string Name { 
      get { return _name; }
    }
    public Student(string name) {
      _name = name;
    }
  }
}

// My Xml Serialization Type
namespace MyProject.Serialization {
  public class SerializableStudent {
    public string Name;

    public SerializableStudent(Student source) {
      Name = source.Name;
    }

    public Student ConvertToStudent() {
      return new Student(Name);
    }

  }
}
0 голосов
/ 04 февраля 2011

В частности, для сериализации вы можете определить процесс вручную с помощью интерфейса ISerializable.

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