1

据我了解,所有编译时 .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 页)没有讨论这种限制。

4

1 回答 1

0

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

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

PropertyChanged 对ImplementPropertyChangedAttribute

于 2015-02-28T10:49:49.023 回答