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

How to define invariant and postconditions using PostSharp?

我在 PostSharp 文档中找到了一个关于 contracts. As I understood that feature allows only to check input and output parameters throught aspects. But I didn't find anything about class invariants and postconditions. Before I tried to use C# Code Contracts but .Net Core doesn't support that thing. Now I want to try to use OnMethodBoundaryAspect 的主题,该主题来自 PostSharp,用于检查不变量、前提条件和后置条件。如果我使用 PostSharp,最好的方法是什么?是否存在其他用于合约编程的工具?使用工具的主要原因是我不想将主代码与合同检查绑定。

这个博客 class 不变量有一个很好的例子 post:https://www.postsharp.net/blog/post/inheritance-of-aspects-in-postsharp-1-5-ctp-2

基本上,您创建一个带有方法的接口来检查不变量,您创建一个 OnMethodBoundary 方面,它使目标类型中的所有 public 方法从 [= 之前​​的接口调用方法24=] 在方法调用之后,您在界面上应用了方面。您还可以将要继承的方面设置为实现该接口的所有类型。 (详见博客 post。)

这样,通过在 class 中实现接口,您会自动检查前置条件和 post 条件。

接口和切面的代码可以是这样的,在博客中看到post:

[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