public void Intercept(IInvocation invocation) { var property = invocation.GetPropertyIfSetInvocation(); if (invocation.InvocationTarget == null || property == null) { invocation.Proceed(); var attributes = invocation.Method.GetCustomAttributes(typeof(ModifiesAttribute), true).OfType<ModifiesAttribute>(); if (invocation.InvocationTarget != null && attributes.Any()) { foreach (var modifiesAttribute in attributes) { var modified = invocation.InvocationTarget.GetType().GetProperty(modifiesAttribute.PropertyName); RaisePropertyChanged(invocation.InvocationTarget, modified); } } return; } RemoveAssociation(invocation.InvocationTarget, property.Value(invocation.InvocationTarget), property); invocation.Proceed(); AddAssociation(invocation.InvocationTarget, property.Value(invocation.InvocationTarget), property, RaisePropertyChanged); RaisePropertyChanged(invocation.InvocationTarget, property); }