今天我升級到了PostSharp 3.在我的項目中引用了正確的DLL之後,我編譯了一切似乎都很好,直到遇到運行時異常。在PostSharp 2.1中工作得很好的一個方面現在有不同的表現。在PostSharp 3.0中突破IAspectProvider的變化?
這是一個在IAspectProvider
的幫助下應用的通用方面。全部來源can be found on 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
作爲該方面的參數,與ViewModel.ActivityOverview
作爲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;
}
}