| 

.NET C# Java Javascript Exception

4
Hallo zusammen,
ich hab folgendes Problem:
Ich habe in den tiefen meines Framesworks eine Basisklasse, die INotifyPropertyChanged implementiert.
Ganz oben habe ich meine LinqToSQL Klassen, die (partial sei dank) von einer Klasse aus meinem Framework erben. So, zwischen der LinqToSQL Klasse und meiner PropertyChanged Basisklasse liegen noch einige Klassen dazwischen.

Jedenfalls das Problem ist nun das Folgende:
Das Event PropertyChanged wird von LinqToSQL selbst implementiert, weshalb alle, die die Linq Klasse verwenden, sich natürlich an das Event in der Linq Klasse binden. Rufe ich allerdings in der Linq Klasse die Methode aus der Basis Klasse auf, die PropertyChanged auslösen soll, naja dann wird eben das PropertyChanged Event auf Basisklassen Ebene ausgelöst. Dort hat sich aber niemand in das Event gebucht, weswegen der call dort ins leere läuft. Klar PropertyChanged wurde als Event ja auch auf der obersten Ebene neu deklariert.

Kann ich irgendwie das Problem lösen, in dem ich z.b. irgendwie in der Basis Klasse prüfen kann ob es eine *neu* implementierung von dem event in einer abgeleiteten Klassen gibt und dann eben diese aufzurufen, statt der eigenen Implementierung?

Die PropertyChanged Basis Klasse sieht in etwa so aus:

public class PChangedBase : INotifyPropertyChanged
{
protected void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}

public event PropertyChangedEventHandler PropertyChanged;
}


Vielen lieben Dank für eure Hilfe :)
News:
23.01.2012
ChrisFFM 33 4
2 Antworten
3
Ich denke, Du solltest auf jeden Fall darauf verzichten, INotifyPropertyChanged in der Basisklasse zu implementieren - es sei denn, Du kannst dem LINQ-Codegenerator beibringen, das Interface nicht seinerseits selbst zu implementieren, oder zumindest ein override in die Methoden-Deklaration hineinzunehmen. Wie Du selbst schreibst: niemand registriert sich bei Deinem Basisklassen-Event, wenn es vom LINQ-Code versteckt wird (der Compiler sollte dafür eigentlich sogar eine Warnung erzeugen).

Für NotifyPropertyChanged sehe ich folgende Optionen:

  • Prüfen, ob die LinqToSQL-Klassen nicht schon selbst einen Mechanismus mitbringen, das Event auszulösen (ich habe gerade keinen Beispielcode parat, um selber nachzuschauen, und kenn mich mit Linq2Sql auch nicht so gut aus). Dann könntest Du Dir PChangedBase komplett sparen.
  • Auf die Vererbung verzichten, stattdessen NotifyPropertyChanged in das partial-class-file hineinziehen, das Du ja sowieso schon benutzt. Bei so wenig und so einfachem Code würde ich die dadurch entstehende Duplizierung für vertretbar halten. Ist aus meiner Sicht die einfachste und klarste Variante.
  • Die Signatur von NotifyPropertyChanged ändern in
    NotifyPropertyChanged(System.ComponentModel.PropertyChangedEventHandler h, string name)
    (Implementierung sollte klar sein) und in den LINQ-Klassen statt
    NotifyPropertyChanged("name");
    schreiben
    NotifyPropertyChanged(PropertyChanged, "name");

  • Mit Reflection arbeiten, um festzustellen, ob das Event existiert, und es dann ggf. auszulösen (würde ich eher nicht empfehlen, hätte für mich die Kategorie "Hack");
23.01.2012
Matthias Hlawatsch 13,2k 4 9
Hm also als mir das Problem aufgefallen ist(waren aktuallierungs Probleme mit WPF), habe ich eben in der Linq2SQL Klasse eine neue Methode geschrieben und die Teile, die ich erweitert hatte (neue Eigenschaften z.b.) eben auf das *neue* event umgeleitet. Das Problem besteht aber in den Klassen zwischen der Linq2SQL Klasse und der PChangedBase, da liegen noch ein paar dazwischen, die alle das Event aus PChangedBase nehmen. Wenn man dem LinqMapper nur sagen könnte ein override davor zu schreiben...
ChrisFFM 24.01.2012
0
Ich bin mir nicht sicher, ob ich die Frage so richtig verstanden habe, aber Du könntest folgendes machen:
Das edmx Modell wird von VisualStudio mittels T4-Templates in ein code-behind File überführt.
Falls Du also hier anderen Output Code erstellen möchtest, der beispielsweise die INotifyPropertyChanged Schnitttstelle implementiert, dann könntest Du einfach das vorhandene Code-Erstellungs Template anpassen.

Hier ein Artikel der dies im Detail beschreibt:
http://msdn.microsoft.com/en-us/data/gg558520
24.01.2012
SvenG 31 2
Es handelt sich aber nicht um das EntityFramework, sondern um den Linq2SQL OR Mapper, habe dort nichts gefunden wie man in den Prozess der Klassen erstellung eingreifen kann, so dass diese auf eine eigene implementierung des Events verzichten.
ChrisFFM 24.01.2012

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH