Laden...

Generischer Typ in Event

Erstellt von tkrasinger vor 14 Jahren Letzter Beitrag vor 14 Jahren 663 Views
T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 14 Jahren
Generischer Typ in Event
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?

Gelöschter Account
vor 14 Jahren

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>
T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 14 Jahren

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 ...

Gelöschter Account
vor 14 Jahren

kann doch nicht

theoretisch schon.

du verwechselst gerics mit dynamics. felder einer klasse brauchen bei der instanziierung der klasse ihren typ.

T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 14 Jahren

hm, habs kapiert. Muss ich den Event doch nicht typ-spezifisch machen, dabei wär das so schön gewesen.

Gelöschter Account
vor 14 Jahren

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