1

今天我升级到 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.ActivityOverviewas 参数形成对比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;
  }
}
4

1 回答 1

0

原来我是新版本的一个bug。NuGet 上的更新版本修复了该问题。


在修复发布之前,我通过引入非泛型成员并在运行时更多地依赖反射来临时解决它。

[IntroduceMember( Visibility = Visibility.Private )]
//public CommandFactory<TCommands> CommandFactory
public object CommandFactory
{
    get { return _commandFactory; }
    private set { _commandFactory = value; }
}

请注意,PostSharp 仍然会生成不正确的转换(在这种情况下应该是):Laevo.ViewModel.Main

private object CommandFactory
{
  get
  {
    return ((ViewModelAspect<Laevo.ViewModel.ActivityOverview.Binding.Properties, Laevo.ViewModel.ActivityOverview.Binding.Commands>) this.\u003C\u003Ez__aspect35).CommandFactory;
  }
}

但是,由于创建了正确的泛型方面,我可以在运行时转换为正确的类型。一切正常......代码变得更加混乱(并且可能由于更多地依赖反射而变慢)。

于 2013-08-22T14:27:07.303 回答