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 に答える