Общие ограничения класса - можно ли указать, что общий тип можно сериализовать как XML? - PullRequest
2 голосов
/ 20 октября 2011

Я пишу универсальный класс, который пытается сериализовать объект типа T как XML. К сожалению (как я уверен, вы знаете), не все объекты могут быть успешно сериализованы как XML, поэтому я хотел бы иметь возможность написать ограничение, которое указывает, что T может быть только классом, который XML Serializable. Это вообще возможно?

Я уверен, что ответ на этот вопрос "нет", но решил, что я все равно спросил бы, если я что-то пропустил.

Ответы [ 2 ]

5 голосов
/ 20 октября 2011

Доступны только следующие ограничения:

  • class / struct
  • new()
  • BaseType / Interface

Из них только 1012 * немного интересны только :new() (так как XmlSerializer требует открытого конструктора без параметров) и :Interface (так как IXmlSerializable является одним изопции);однако:

  • IXmlSerializable не требуется , поэтому не применяется
  • здесь нет никаких ограничений, заставляющих тип быть public *Тип 1031 * (и открытый тип открытого типа, в случае вложенных типов)
  • он не учитывает ограничения обобщенных типов

, так что вкратце: нет,это не то, что вы можете применить через общие ограничения

4 голосов
/ 20 октября 2011

Вы правы, ответ - нет, вы не можете ограничить универсальные типы в XML-сериализации.

Причина этого заключается в том, что у XML Serializer есть несколько очень специфических правил относительно того, что он будет сериализовать (наиболее примечательно, он сериализует только общедоступные свойства и только те типы, которые имеют общедоступный конструктор без параметров).Факторы, делающие сериализуемый XML-класс, не могут быть выражены в терминах типов, и поэтому нет никакого способа сделать для него общее ограничение.

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

...