Hallo,
ich stehe vor einem kleinen Problem.
Sobald die Basisklasse ein Template ist, kann ich von der abgeleiteten nicht mehr auf die Members vom Typ Event zugreifen.
Das Ereignis "BaseClass<string>.Event1" kann nur links von += oder -= stehen (es sei denn, es wird innerhalb des Typs "BaseClass<T>" verwendet)
public delegate void del();
public abstract class BaseClass<T>
{
T member;
public event del Event1;
public BaseClass(){}
}
public class Class1 : BaseClass<string>
{
public Class1(){}
public void DoSomething()
{
if (this.Event1 != null)
{
//Fehler bei diesem Zugriff auf Event1
}
}
}
Warum ist das so?
.
Du hast da einen Event deklariert und du bist hier in eine klassische Compiler magic Falle gerannt. 😁
Wenn du das hier schreibst:
public event DelegateTyp MyEvent;
wird eigentlich das hier daraus:
DelegateTyp myEvent;
public DelegateTyp MyEvent
{
add { myEvent += value; }
remove{ myEvent -= value; }
}
Innerhalb der Klasse wird der Compiler das private Feld des Delegaten benutzen.
Deshalb geht dort das hier:
if(MyEvent != null)
blabla;
Eigentlich wird das hier kompostiert:
if(myEvent != null)
blabla;
Der öffentliche Event hat, wie für Events üblich nur add und remove als Accessors.[1]
Deshalb kannst du in der Ableitung oder in anderen Typen nur noch Delegaten hinzufügen oder entfernen.
Es gibt 2 Lösungen für dein Problem, eine ist das übliche Event pattern in .Net, die andere ist ein übler Hack-around. 😉
*
public event DelegateTyp MyEvent;
protected virtual OnMyEvent(SomeEventargsDescendant eventArguments)
{
if(MyEvent != null)
MyEvent(this, eventArguments);
}
protected DelegateTyp myEvent;
public DelegateTyp MyEvent
{
add { myEvent += value; }
remove{ myEvent -= value; }
}
Die 2. Lösung gibt dir in Ableitungen direkten Zugriff auf den Delegaten, die erste lässt dich in Ableitungen nur den Deleagten feuern ohne direkten Zugriff zu gewähren.
In 99.9P% aller Fälle sollte die 2. Lösung als "pfui deivel" eingestuft werden. 😉
[1]Events sind neben Properties Abstraktionen von Feldern.
Properties haben get_PropertyName/set_PropertyName, Events haben add_EventName/remove_EventName.
Edit1&2: noch mehr Copy&Waste Fehlerchen... 8o