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

Using compile-time aspects to implement abstract interfaces

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

如果您想使用这些框架中的一个方面来实现抽象接口的成员,这会造成障碍,因为被修改的 class 直到 [=] 之后才会实现该接口28=] post-构建步骤。如果编译阶段由于缺少接口而失败,post-构建步骤永远不会到达 运行。

例如,编写一个 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 页)没有讨论这种限制。

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

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

PropertyChanged 对 ImplementPropertyChangedAttribute

做了类似的事情