如何使用 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。
我在 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。