Automatyczne wywołanie PropertyChanged

0

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ć?

2

Nie do końca wiem czy o to ci chodzi, ale Fody to robi: https://github.com/Fody/PropertyChanged#readme, aczkolwiek modyfikując już utworzone assembly.

0

No sprytne. O coś takiego właśnie mi chodziło. Tylko myślałem, że da się to ogarnąć w runtime.

0

Jeśli model będzie mieć wirtualne propertki to możesz w locie generować proxy z przeciążonymi setterami. Nie jest to super wydajne, ale możliwe do wykonania. Ogarnij implementację proxy w NHibernate

0

A możesz podać jakiś kawałek kodu?

2

Ja nie przepadam za bardzo za magią, także napisałem sobie dodatek do VS który mi generuje dla zaznaczonych pól w klasie pełnoprawne WPF property :)

title

1 użytkowników online, w tym zalogowanych: 0, gości: 1