如何根据现有属性引入新属性并修改现有属性?

时间:2017-06-01 16:23:16

标签: c# aop postsharp fody

我正在尝试自动化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)注入名为IntroducedProperty0IntroducedProperty1的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实现?

0 个答案:

没有答案