AOP / PostSharp и грязная проверка - получить имя свойства лучше? - PullRequest
1 голос
/ 17 декабря 2009

Мой аспект:

  [Serializable]
        [MulticastAttributeUsage(MulticastTargets.Class, Inheritance = MulticastInheritance.Strict)]
        public sealed class NotifyPropertyChangedAttribute : InstanceLevelAspect
        {
             [OnLocationSetValueAdvice, MulticastPointcut(Targets = MulticastTargets.Property)]
            public void OnPropertySet(LocationInterceptionArgs args)
            {
                if (args.Value == args.GetCurrentValue()) return;
                args.ProceedSetValue();

                IPersistent iENtity = this.Instance as IPersistent;
                if (iENtity != null)
                {
                    // do something with iENtity
                    // need to identify property name without using reflection
                }
           }
        }

Я применил этот NotifyPropertyChangedAttribute ко всему классу, чтобы я мог обрабатывать изменения свойств, все работает как положено.

Но я хотел бы знать имя свойства, которое было изменено (чтобы я мог хранить имена грязных свойств в некоторой коллекции). Я хотел использовать LocationInterceptionArgs :: Location, но я прочитал это:

"Using this property causes the aspect weaver to generate code that has non-trivial runtime overhead."

Есть ли другой способ получить имя затронутого свойства в моем аспекте, но без использования отражения или другого кода, который имеет большие накладные расходы во время выполнения?

Есть идеи (или лучше - примеры)? Может быть, я могу реализовать это как-то иначе? Мне просто нужен какой-то способ идентификации свойства во время выполнения, даже без имени - просто какое-то значение, которое я могу использовать, чтобы найти свойство в некотором словаре <> позже ...

Спасибо.

...