Cześć, ostatnio trochę sobie eksperymentowałem z ILGeneratorem i wpadłem na super pomysł. Mamy interfejs INotifyPropertyChanged. I fajnie. Jednak wymaga on, żeby w odpowiednich setterach właściwości wywoływać zdarzenie:
string name;
public string Name
{
get { return name; }
set
{
if(value != name)
{
name = value;
NotifyPropertyChanged();
}
}
}
void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertName));
}
Wszystko się rozbija o wywołanie metody NotifyPropertyChanged. Jest to dość upierdliwe mimo wszystko. Dlatego wpadłem na pomysł: "Hej, a gdyby tak zrobić to automatem?"
No i zacząłem kombinować.
Za pomocą refleksji wyjąłem sobie wszystkie publiczne właściwości w klasie i dobrałem się do ich SetMethod (to ukryta metoda, która wykonuje całą magię)
Pomyślałem, że mogę stworzyć kawałek kodu IL i wykonać go na zakończenie tej właśnie metody. Mój kod miał po prostu wywołać NotifyPropertyChanged,
Jednak po wieeeeeeeelu różnych próbach poddałem się. Próbowałem nawet podmienić metody (oryginalną set_name na moją DynamicMethod), jednak wszystkie próby kończyły się albo wywałką aplikacji, albo po prostu wszystko działało po staremu. Przeczytałem już chyba setki stron o podmienianiu ciał metod, ale chyba nie ma żadnego sposobu, na którym można by polegać.
Więc moje pytanie - czy da się w ogóle coś takiego zrobić?