Как установить атрибуты сериализации Xml для экземпляра (или для каждого типа) с помощью универсальных классов - PullRequest
3 голосов
/ 16 июля 2011

У меня есть класс (более сложный, но упрощенный для примера), подобный этому:

public class MyClass {
   public MyClass() { }

   [XmlAttribute("somename")]
   public String MyString { get; set; }

   [XmlElement("AString")]
   public List<String> TheList { get; set; }

   // Other uninteresting methods and private members.
}

Сериализация Xml работает отлично. То, что я хотел бы сделать (если это не слишком безумно), это изменить этот класс, чтобы использовать дженерики, чтобы я мог использовать в «TheList» разные типы. Я хочу, чтобы имя XmlElement можно было как-то указывать для каждого экземпляра (или для каждого типа).

Идеальным было бы что-то, где имя задается при создании экземпляра. Было бы неплохо при замене макроса заменить строки параметров атрибута, но я понятия не имею, возможно ли что-либо подобное. Может быть, это будет выглядеть примерно так:

public class MyClass<T, (MagicalMacro)> {
   // Some kind of constructor, methods, whatever as needed.
   // MyString as above.

   [XmlElement(MagicalMacro)] // This does not compile.
   public List<T> TheList { get; set; }

   // Etc.
}
...
MyClass<int, (MagicalMacro)> myClass = new MyClass<int, "AnInteger">();

Менее идеальным, но все же удовлетворительным было бы назвать выходное имя «TheList» в зависимости от типа T.

public class MyClass<T> {
   // Same constructor and MyString as the first example.

   [XmlElement(typeof(T).Name)] // This does not compile - string not constant.
   public List<T> TheList { get; set; }

   // Etc.
}

Спасибо.

1 Ответ

1 голос
/ 16 июля 2011

Атрибуты нужны литералы.Чтобы достичь этого, используйте XmlAttributeOverrides для настройки во время выполнения и передачи его конструктору XmlSerializer.Тем не менее: кешируйте и повторно используйте экземпляры сериализатора, когда вы делаете это, иначе вы будете пропускать динамически сгенерированные сборки.

...