【发布时间】:2015-02-28 18:49:49
【问题描述】:
据我了解,所有编译时 .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' does not implement interface member 'ITestVM.SomeCommand'”
我相信 Commander.Fody 会创建一个名为 SomeCommand 的 ICommand 实例,但它永远没有机会这样做。
有没有办法使用编译时面向方面的框架来实现抽象接口?我读过“AOP.NET”一书,编译时编织部分(第 183-190 页)没有讨论这种限制。
【问题讨论】:
-
您可以做的是让 AOP 框架注入整个接口,而不仅仅是实现。但这可能会导致您的代码中出现其他问题,因为您可能在某个地方期望 TestVM 来实现 ITestVM,而编译器会抱怨那里。
-
可以将一些对象转换为接口,即使它没有实现它(在编译时)。所以你可以通过将 TestVM 转换为 ITestVM 来解决这个问题。