Публичный геттер, защищенный сеттер с CodeDOM - PullRequest
2 голосов
/ 19 июня 2009

Можно ли с помощью CodeDOM создать свойство с помощью открытого и защищенного методов установки? Цель состоит в том, чтобы добиться чего-то похожего на следующее.

[Serializable]
public class Wrapper {
  public Wrapper() { }
  private string _Field;
  public string Field { get; protected set; }
}

У меня есть большой API на основе COM, для которого я хочу скомпилировать оболочку .Net, чтобы с ней было проще использовать такие функции .Net, как LINQ, Reflection, наследование и сериализация. Единственно возможный способ - автоматизировать большую часть этой работы с помощью генерации кода.

Эти объекты содержат некоторые свойства только для чтения, которые я хочу показать через сериализацию, для которой требуется установщик свойств. Но до тех пор, пока я не нашел никаких способов установить сеттер защищенным или подобным.

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

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

1 Ответ

1 голос
/ 15 июля 2009

Просто заверните это. Это невозможно сделать в CodeDOM, за исключением вывода необработанных строк.

И что происходит с XMLSerializer, сериализатор может сериализовать класс, но он не сериализует значение с защищенным установщиком.

Так что невозможно. Альтернативный способ, который я использовал, заключался в том, чтобы сгенерировать метод ToSerializableType() для каждого из этих классов, который возвращает экземпляр аналогичного класса, который имеет все свойства для чтения / записи.

...