2013-07-29 30 views
0

我一直在使用PostSharp一年,最近轉移到版本3,我已經取得了很大的成功。我試圖擴大它在我們公司的採用範圍,採用的殺手功能將是多播合同屬性。Postsharp中可能存在的錯誤ReturnValue位置方面

我一直在尋找到PostSharp.Patterns.Contracts和書面MulticastAttributes他們,但有幾件事情將這些方面給我們遺留代碼時會產生摩擦,比如代替一些字符串驗證,但最ArgumentExceptions ArgumentNullException重要的是ReturnValues不能使用這些屬性。

我不得不使用OnMethodBoundaryAspect方法來增加方面的數量 - 一組參數和一組具有相同驗證的相同驗證,儘管不同的例外,這是我們的開發人員無法接受的,所以我一直試圖開發一個可以應用於參數和返回值的一組合約。

我注意到LocationContractAttribute直接來自MulticastAttribute,只包含支持各種異常和它們的消息的代碼,所以它看起來像是一個簡單的任務來編寫我自己的代碼,但是當編譯後的Postsharp啓動時,下面的簡單方面會給出一個異常:

[AttributeUsage(AttributeTargets.ReturnValue), 
    AspectConfiguration(SerializerType = typeof(MsilAspectSerializer)), 
    MulticastAttributeUsage(
     MulticastTargets.ReturnValue 
     , TargetMemberAttributes = MulticastAttributes.NonAbstract 
     , Inheritance = MulticastInheritance.Multicast 
     , PersistMetaData = true 
    )] 
public class SimpleReturnValueAttribute: MulticastAttribute, 
    ILocationValidationAspect<string> 
{ 
    public Exception ValidateValue(string value, string locationName, LocationKind locationKind) 
    { 
     return null; 
    } 
} 

到類:

public class AspectTarget 
{ 
     [return: SimpleReturnValue] 
     public string ReturnEmptyString2() 
     { 
      return null; 
     } 
} 

給出了異常:

Error 1 Unhandled exception (3.0.26.0, 32 bit, CLR 4.5, Release): System.NullReferenceException: Object reference not set to an instance of an object. 
    at PostSharp.Sdk.CodeModel.MethodDefDeclaration.^bvoT7mPt9PXI(Int32 _0) 
    at PostSharp.Sdk.AspectInfrastructure.CanonicalMethodMapping.^X0NY.EmitLoadArgument(Int32 _0, InstructionWriter _1) 
    at ^670BgLZZ9jB2.^X5f4d1Yo.Implement(MethodBodyTransformationContext _0) 
    at ^EbCRMdujK27A.^LuETqvLKzZPB(MetadataDeclaration _0, MetadataDeclaration _1, MethodSemantics _2, InstructionBlock _3, Object[] _4, CanonicalMethodMapping _5, LocalVariableSymbol _6, InstructionSequence _7, TypeDefDeclaration _8, PipelineTransversalState _9) 
    at ^PE9ycIe2cLwm.^HvVDHXOj(MetadataDeclaration _0, IDependencyTransformationInstance[] _1, PipelineTransversalState _2, MethodSemantics _3) 
    at PostSharp.Sdk.AspectInfrastructure.AspectInfrastructureTask.^jwku0geZ(MetadataDeclaration _0, PipelineTransversalState _1, MethodSemantics _2, Boolean _3) 
    at PostSharp.Sdk.AspectInfrastructure.AspectInfrastructureTask.^MwzbegST(IMetadataDeclaration _0) 
    at PostSharp.Sdk.AspectInfrastructure.StructuredDeclarationDictionary`1.^d+wOzSPF(IMetadataDeclaration _0, Func`2 _1) 
    at PostSharp.Sdk.AspectInfrastructure.StructuredDeclarationDictionary`1.^+g+TCqVg(TypeDefDeclaration _0, Func`2 _1, Set`1 _2) 
    at PostSharp.Sdk.AspectInfrastructure.StructuredDeclarationDictionary`1.^fJqG(Func`2 _0) 
    at PostSharp.Sdk.AspectInfrastructure.AspectInfrastructureTask.Execute() 
    at PostSharp.Sdk.Extensibility.Project.ExecutePhase(String phase) 
    at PostSharp.Sdk.Extensibility.Project.Execute() 
    at PostSharp.Hosting.PostSharpObject.ExecuteProjects() 
    at PostSharp.Hosting.PostSharpObject.InvokeProject(ProjectInvocation projectInvocation) 

從LocationLevelAspect派生方面給出了相同的錯誤。我也嘗試過不同的值AspectConfiguration和PersistMetaData,或者完全省略它們,但是我得到相同的異常。

可以做一些援助。

乾杯。

回答

0

根本原因是ILocationValidationAspect無法應用於返回值。這種情況不受支持,但不是得到一個很好的錯誤消息,而是得到一個異常。

目前,返回值必須使用OnMethodBoundary方面進行驗證(OnSuccess建議)。

如果您想爲開發人員提供一個自定義屬性而不是兩個自定義屬性,則可以使用此單一自定義屬性實現IAspectProvider,並且此方面提供了兩種實現之一。

請使用https://postsharp.uservoice.com/來請求此功能(ILocationValidationAspect應支持返回值)。

謝謝。