今天我升级到 PostSharp 3。在我的项目中引用了正确的 DLL 之后,我编译并且一切看起来都很好,直到我得到一个运行时异常。在 PostSharp 2.1 中一直运行良好的方面现在表现不同。
这是一个通用方面,在IAspectProvider
. 完整的源代码可以在 GitHub 上找到。
public IEnumerable<AspectInstance> ProvideAspects( object targetElement )
{
Type targetType = (Type)targetElement;
Type genericAspect = typeof( ViewModelAspect<,> ).MakeGenericType( _propertiesEnumType, _commandsEnumType );
yield return new AspectInstance( targetType, Activator.CreateInstance( genericAspect ) as IAspect );
}
似乎发生的事情是将错误的泛型参数的方面应用于我的类型。当我使用 dotPeek 查看后编译代码时,我看到了一个新引入的带有泛型参数的泛型字段,这些泛型参数旨在应用于不同的类型。事实上,所有应用切面的类型共享相同的泛型参数(因此只有一个是正确的)。
这之前工作正常,我应该考虑与 PostSharp 3 中的变化有关的任何事情吗?IAspectProvider
出于调试目的,我已经在构建时检查了是否正确设置,_propertiesEnumType
并且_commandsEnumType
它们是正确的,因此我认为之后一定会出现问题;也许创建的方面被应用于错误的实例?
您可以在下面看到 PostSharp 似乎做错了什么的反编译代码。似乎引入了正确的方面,但是我引入的属性被暴露为不同的(错误的)类型。请注意ViewModel.Main
方面的 as 参数,与 的ViewModel.ActivityOverview
as 参数形成对比CommandFactory
,后者也应该如此ViewModel.Main
。
[NonSerialized]
private ViewModelAspect<Laevo.ViewModel.Main.Binding.Properties, Laevo.ViewModel.Main.Binding.Commands> \u003C\u003Ez__aspect35;
private CommandFactory<Laevo.ViewModel.ActivityOverview.Binding.Commands> CommandFactory
{
get
{
return ((ViewModelAspect<Laevo.ViewModel.ActivityOverview.Binding.Properties, Laevo.ViewModel.ActivityOverview.Binding.Commands>) this.\u003C\u003Ez__aspect35).CommandFactory;
}
}