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

C# Postsharp根据条件将一些逻辑从运行时移动到编译时,c#,aop,postsharp,C#,Aop,Postsharp,我有一个特点: [Serializable()] [IntroduceInterface(typeof(IPersistable), OverrideAction = InterfaceOverrideAction.Ignore)] [MulticastAttributeUsage(MulticastTargets.Class)] public sealed class PersistableAttribute : InstanceLevelAspect, IPersistable {

我有一个特点:

[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的注入移动到编译时。 i、 e.在编译时,当Validate(args.Location.PropertyInfo)==true时,注入Work(),否则什么都不做(甚至不验证)


提前感谢。

您应该通过重写名为CompileTimeValidate的方法来进行构建时验证。如果需要OnPropertySet仅应用于属性的子集,请使用MethodPointcut;您还可以在实现切入点的方法中进行验证(仅当方法有效时才执行
收益率返回方法)。

您可以解释这些方法的作用。并非所有内容都可以在编译时计算。