我有一个属性:
[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(),否则什么都不做(甚至不验证)
提前致谢。
答案 0 :(得分:0)
您应该通过覆盖名为CompileTimeValidate的方法来进行构建时验证。如果只需要将OnPropertySet应用于属性的子集,请使用MethodPointcut;您还可以在实现切入点的方法中进行验证(仅当方法有效时才执行yield return method
。)