public abstract class PresentationObject<T>
{
/// <summary>
/// Used to handle deferred loading events
/// </summary>
public delegate List<LT> LoadAssocListEventHandler<LT>(PresentationObject<T> sender, string listPropertyName);
#region Event.LoadAssocList
private LoadAssocListEventHandler<LT> _LoadAssocList;
/// <summary>
/// Occurs when a list property is loading its objects
/// </summary>
[Browsable(true)]
public event LoadAssocListEventHandler<LT> LoadAssocList
{
add
{
_LoadAssocList += value;
}
remove
{
_LoadAssocList -= value;
}
}
protected virtual List<LT> OnLoadAssocList<LT>(string propName)
{
if (_LoadAssocList != null)
return _LoadAssocList(this, propName);
else
return null;
}
#endregion
....
}
Das lässt sich leider nicht kompilieren, auf den Zeilen der Eventdeklaration krieg ich:
Error 1 The type or namespace name 'LT' could not be found (are you missing a using directive or an assembly reference?)
Ich würde in einer konkreten Implementierung vom PresentationObject dann z.B folgendes aufrufen wollen:
public class Person : PresentationObject<Person>
{
private List<Adresse> _Adressen;
public List<Adresse> Adressen
{
get
{
if( this._Adressen == null )
this._Adressen = OnLoadAssocList<Adresse>("Adressen");
return this._Adressen;
}
}
}
Hat jemand eine Idee wie ich den Event, den EventHandler und die dazugehörige Methode implementieren muss/kann?
methoden können ihren eigenen generischen typ haben. felder und properties allerdings müssen diesen typ beim instanziieren der klasse bekommen. daher musst du das so machen:
public abstract class PresentationObject<T,LT>
und
public class Person : PresentationObject<Person,Addresse>
scherz oder? Ich hab Klassen mit 10 und mehr List-Eigenschaften, kann doch nicht
Person : PO<Person,Adresse,Kontakte,Aufgabe,Mail,Buchung,Konto,Bemessungssatz,Vorname,Nachname,Kommunikation,Funktion>
schreiben, da wirst ja irre ...
hm, habs kapiert. Muss ich den Event doch nicht typ-spezifisch machen, dabei wär das so schön gewesen.
das event ist recht ungewöhnlich implementiert. evtl wärst du ohnehin besser mit der standardvorgehensweise beraten?
verwende eventargs um informationen auszutauschen und verwende keinen rückgabetyp.
siehe auch:
Guide to C# -> Styleguide -> Events