Я пытаюсь автоматизировать этот шаблон обходного пути 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].
Может быть, это достижимо с Фоди?
DateTime
были бы лучшим подходом? - person Christian Gollhardt   schedule 12.06.2017