0

我有一个属性:

[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(),否则什么都不做(甚至不验证)

提前致谢。

4

1 回答 1

0

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

于 2012-08-13T16:51:06.203 回答