我正在尝试自动化此 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 教程,但没有关于 (a) 如何介绍具有动态名称的成员和 (b) 如何将属性([XmlAttribute]
在我的情况下)从现有成员移动到新创建的成员的信息。
我不需要一个确切的解决方案 - 只需一些提示就足够了。
更新:通过进一步的研究,我可以得出 PostSharp 不支持动态方法命名的结论。PostSharpIt 也不能从现有方法中删除属性。
所以让我用另一种方法来解决这个问题:
1) 注入 10 个名为IntroducedProperty0
, IntroducedProperty1
, ... 的新属性,这似乎是微不足道的。属性是硬编码的。
2) 以某种方式在 (1) 之后/使用 (1) 将属性添加[XmlAttribute("nameOftheOriginalProperty#N")]
到IntroducedPropertyN
其中 N=0..9 且 M<=N的第一个 M。这是一种动态。这在向现有(未注入)成员添加属性时是可能的。但是他们说您不能向注入的成员添加属性。其余注入的方法(从 M 到 N)应标记为 [XmlIgnore]。
3) 用 [XmlIgnore] 标记类的原始方法。
也许这可以通过 Fody 实现?