我正在尝试自动化this XmlSerializer workaround pattern。 请参阅下面的更新。
是否可以使用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)注入名为IntroducedProperty0
,IntroducedProperty1
的10个新属性,......这似乎是trivial。属性是硬编码的。
2)以某种方式/(1)将属性[XmlAttribute("nameOftheOriginalProperty#N")]
添加到IntroducedPropertyN
的前M个,其中N = 0..9且M <= N.这有点动态。当adding attributes to existing(未注入)成员时,这是可能的。但是他们说你cannot add attributes to injected members。
其余注入的方法(从M到N)应标记为[XmlIgnore]。
3)用[XmlIgnore]标记类的原始方法。
也许这可以通过Fody实现?