Как ввести новое свойство на основе существующего и изменить существующее?

Я пытаюсь автоматизировать этот шаблон обходного пути XmlSerializer. См. обновление ниже.

Можно ли ввести новое свойство на основе существующего свойства и изменить атрибуты существующего с помощью PostSharp (или, может быть, другого инструмента AOP)?

Было бы предпочтительнее внести эту модификацию во время сборки.

Пример исходного свойства:

public class TestType {
  // Original version
  [XmlAttribute()]
  public DateTime ReqDateTime {
      get { return this.reqDateTimeField; }
      set { this.reqDateTimeField = value; }
  }
}

Желаемый результат (объявление класса опущено):

// Modified version
// <original property> = "ReqDateTime"
// <original property> marked as XmlIgnore
// New property with name "<original property>ForXml" is introduced with code as per below
// XmlAttribute moved to the newly introduced <original property>ForXml property with parameter "<original property>" 
[XmlIgnore()]
public DateTime ReqDateTime {
    get { return this.reqDateTimeField;}
    set { this.reqDateTimeField = value;}
}

[XmlAttribute("ReqDateTime")]
[EditorBrowsable(EditorBrowsableState.Never)]
public string ReqDateTimeForXml {
    get { return Common.GetAndFormatDate(this, Common.GetCaller()); }
    set { Common.ParseAndSetDate(this, value, Common.GetCaller()); }
}

Я нашел учебник PostSharp по введению членов, но не нашел информации о (а) как вводить элементы с динамическими именами и (б) как перемещать атрибуты ([XmlAttribute] в моем случае) из существующего члена во вновь созданный.

Мне не нужно точное решение - достаточно подсказок.


Обновление: Из дальнейшего исследования я могу сделать вывод, что PostSharp не поддерживает динамическое именование методов. Также PostSharpIt не может удалить атрибут из существующего метода.

Итак, позвольте мне переформулировать проблему еще одним подходом к ее решению:

1) Добавьте 10 новых свойств с именами IntroducedProperty0, IntroducedProperty1, ... Это кажется тривиальным . Свойства жестко запрограммированы.

2) Каким-то образом после / с (1) добавить атрибут [XmlAttribute("nameOftheOriginalProperty#N")] к первому M из IntroducedPropertyN, где N = 0..9 и M ‹= N. Это отчасти динамично. Это возможно, когда добавляются атрибуты к существующим (не введены) члены. Однако они говорят, что вы не можете добавлять атрибуты к внедренным членам. Остальные внедренные методы (от M до N) должны быть помечены как [XmlIgnore].

3) Отметьте оригинальные методы класса с помощью [XmlIgnore].

Может быть, это достижимо с Фоди?


person Anton Krouglov    schedule 01.06.2017    source источник
comment
В чем проблема? Может быть, специальный сериализатор, какие правильные форматы DateTime были бы лучшим подходом?   -  person Christian Gollhardt    schedule 12.06.2017
comment
Да, лучше было бы написать собственный сериализатор, собственный xsd.exe и реализовать связанный wcf. Смотрите мой другой вопрос. Единственная проблема - это объем кода.   -  person Anton Krouglov    schedule 12.06.2017