2013-08-20 35 views
1

今天我升級到了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; 
    } 
} 

回答

0

我竟然是新版本中的一個錯誤。 The updated version on NuGet fixes the issue.


修復被釋放之前,我暫時圍繞它通過引入非普通成員,而不是依靠反射更多的在運行時的工作。

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

注意,不正確轉換(它應該是在這種情況下Laevo.ViewModel.Main)仍然由PostSharp產生:

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

然而,由於正確的通用方面創建,我可以在運行時轉換爲正確的類型。一切正常......代碼變得更加混亂(可能更慢,因爲依靠反射更多)。