使用编译时方面来实现抽象接口

时间:2015-02-10 19:45:07

标签: .net mvvm aop fody

据我了解,所有编译时.NET面向方面编程框架(如PostSharp或Fody)只能处理已经成功编译的代码。

如果您想使用这些框架中的一个方面来实现抽象接口的成员,这会遇到一个障碍,因为正在修改的类在之后构建后步骤之前不会实现接口。如果由于缺少接口而导致编译阶段失败,那么构建后的步骤永远不会运行。

例如,编写WPF MVVM应用程序,我的视图模型有一个抽象接口。接口规定视图模型必须实现命令,例如:

using System.Windows.Input
public interface ITestVM
{
  ICommand SomeCommand { get; }
}

我想创建一个这个视图模型抽象接口的具体实现,使用Commander.Fody来实现ICommand实例。这是我试过的:

using Commander;
public class TestVM : ITestVM
{
  [OnCommandCanExecute("SomeCommand")]
  private bool SomeCommandCanExecute()
  {
    return true;
  }

  [OnCommand("SomeCommand")]
  private void SomeCommandExecute()
  {
  }
}

这会产生错误消息“'TestVM'没有实现接口成员'ITestVM.SomeCommand'”

我相信Commander.Fody 创建一个名为SomeCommand的ICommand实例,但它永远不会有机会这样做。

有没有办法使用编译时面向方面的框架来实现抽象接口?我读过“AOP.NET”一书,编辑时编织一节(第183-190页)中没有讨论这样的限制。

1 个答案:

答案 0 :(得分:0)

这是目前已知的PostSharp和Fody等工具的限制,因为它们是后编译器编织器,而不是编译时编织器。

实现这一目标的最佳方法是实现一个属性,您可以将其用作标记来指示应由编织者修改的类。然后在您的编织器中,您必须将接口和实现添加到标记的类型。

PropertyChanged与ImplementPropertyChangedAttribute

做类似的事情