Dado que este es un problema muy común y una gran razón para elegir un enfoque AOP como sugirió Miguel, I created an example para Afterthought que demuestra la implementación de INotifyPropertyChanged (interceptar conjuntos de propiedades para generar un evento).
La idea de último momento le permite describir las interceptaciones de propiedades muy fácilmente, y hace que la interceptación del conjunto de propiedades sea simple al proporcionarle los valores de antes y después de la propiedad.Se podría hacer algo como esto para identificar las propiedades de interceptar:
public override void Amend<TProperty>(Property<TProperty> property)
{
// Raise property change notifications
if (property.PropertyInfo.CanRead && property.PropertyInfo.CanWrite)
property.AfterSet = NotificationAmender<T>.OnPropertyChanged<TProperty>;
}
que en este caso llama a un método estático OnPropertyChanged
que se parece a esto:
public static void OnPropertyChanged<P>(INotifyPropertyChangedAmendment instance, string property, P oldValue, P value, P newValue)
{
// Only raise property changed if the value of the property actually changed
if ((oldValue == null^newValue == null) || (oldValue != null && !oldValue.Equals(newValue)))
instance.OnPropertyChanged(new PropertyChangedEventArgs(property));
}
Así que si su propiedad original era la siguiente:
string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
Se vería así después de la aplicación de la enmienda anterior utilizando Afterthought:
string name;
public string Name
{
get
{
return name;
}
set
{
string oldValue = Name;
name = value;
NotificationAmender<ConcreteClass>.OnPropertyChanged<string>(
this, "Name", oldValue, value, Name);
}
}
En su caso, el método estático llamado después (o antes) del colocador podría nombrarse como desee y hacer lo que quiera. Este es solo un ejemplo de una razón concreta y bien conocida para interceptar los emisores de propiedades. Dado que usted sabe que las propiedades no son virtuales, no es posible crear subclases de proxy para realizar la interceptación, por lo que creo que los enfoques de AOP como Afterthought o PostSharp son su mejor opción.
Además, con la última idea puede implementar la interceptación de modo que los ensamblados resultantes no tengan referencias o dependencias en Pensamiento posterior y si su lógica de interceptación no agrega ni cambia la API para sus tipos de destino, no hay razón para "propietario" de la clase concreta tendría un problema con el resultado.
Como esa pregunta que sugirió, parece que la API profiler es la única forma de hacerlo, a menos que use algún tipo de cosa post-AOP, que soy no puede usar en este caso, lamentablemente. –