Postsharp根据条件从运行时间到编译时移动一些逻辑

时间:2012-08-13 16:27:55

标签: c# aop postsharp

我有一个属性:

[Serializable()]
[IntroduceInterface(typeof(IPersistable), OverrideAction = InterfaceOverrideAction.Ignore)]
[MulticastAttributeUsage(MulticastTargets.Class)]
public sealed class PersistableAttribute : InstanceLevelAspect, IPersistable
{
    //TODO: revise: move some to compile time
    [OnLocationSetValueAdvice(), MulticastPointcut(Targets = MulticastTargets.Property, Attributes = MulticastAttributes.Instance | MulticastAttributes.NonAbstract)]
    public void OnPropertySet(LocationInterceptionArgs args)
    {
        // sets the value.
        args.ProceedSetValue();

        if(Validate(args.Location.PropertyInfo))
        {
            Work();//Some time-consuming work
        }
    }
}

在运行时,Work()和Validate()使用太多时间。因为属性更改太多而且每次更改属性时,都会调用Validate()。 我正在寻找一种方法来将此OnPropertySet的注入移动到编译时。 即在编译时,当Validate(args.Location.PropertyInfo)== true时,注入Work(),否则什么都不做(甚至不验证)

提前致谢。

1 个答案:

答案 0 :(得分:0)

您应该通过覆盖名为CompileTimeValidate的方法来进行构建时验证。如果只需要将OnPropertySet应用于属性的子集,请使用MethodPointcut;您还可以在实现切入点的方法中进行验证(仅当方法有效时才执行yield return method。)