如何使用PostSharp定义不变条件和后置条件?

问题描述 投票:1回答:2

我在PostSharp文档中找到了有关contracts的主题。据我了解,该功能仅允许从各个方面检查输入和输出参数。但是我没有找到关于类不变式和后置条件的任何信息。在我尝试使用C#代码合同之前,.Net Core不支持该功能。现在,我想尝试使用PostSharp中的OnMethodBoundaryAspect来检查不变量,前置条件和后置条件。如果我使用PostSharp,最好的方法是什么?是否存在其他合同编程工具?使用工具的主要原因是我不想将主要代码与合同检查绑定在一起。

c# postsharp
2个回答
0
投票

好吧,我试图使用我在问题中提到的OnMethodBoundaryAspect。但是,这条路带我找到了我可以命名为“支票换支票”的解决方案。我还在C#语言存储库中找到了一个有趣的thing。我希望这个东西迟早会出现在C#中。


0
投票

此博客文章中有一个很好的类不变量示例:https://www.postsharp.net/blog/post/inheritance-of-aspects-in-postsharp-1-5-ctp-2

[基本上,创建一个带有用于检查不变量的方法的接口,创建一个OnMethodBoundary方面,该方法使目标类型中的所有公共方法在调用方法之前和/或之后从接口调用方法。在界面上应用方面。您还可以将方面设置为继承给实现接口的所有类型。 (有关详细说明,请参阅博客文章。)

通过这种方式,通过在类中实现接口,您可以自动获取之前和之后的条件。

接口和方面的代码可能看起来像这样,如博客文章所示:

[ConsistantAspect]
public interface IConsistant
{
    void CheckConsistency();
}

[AttributeUsage(AttributeTargets.Interface)]
[MulticastAttributeUsage(
    MulticastTargets.Method,
    TargetMemberAttributes =
 MulticastAttributes.Public
 | MulticastAttributes.Protected
 | MulticastAttributes.Internal
 | MulticastAttributes.Instance,
    Inheritance = MulticastInheritance.Multicast)]
[Serializable]
public sealed class ConsistantAspect : OnMethodBoundaryAspect
{
    public override void OnSuccess(MethodExecutionEventArgs eventArgs)
    {
        ((IConsistant) eventArgs.Instance).CheckConsistency();
    }
}

编辑:使用CompileTimeValidate方法,您可以在构建时进行一些验证,并减少验证的运行时开销。参见https://doc.postsharp.net/m_postsharp_aspects_aspect_compiletimevalidate_368fa5ad

© www.soinside.com 2019 - 2024. All rights reserved.