6

我正在尝试自动化此 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 实现?

4

0 回答 0