Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Basistyp von generischer Klasse bekommen
rollerfreak2
myCSharp.de - Member

Avatar #avatar-3271.jpg


Dabei seit:
Beiträge: 928

Themenstarter:

Basistyp von generischer Klasse bekommen

beantworten | zitieren | melden

Hallo,

ich hab ein Problem und weis nicht wie ich das am "besten" löse. Folgendes ist gegeben:


internal class MyBaseClass<T> : IMyInterface
{
    ....
    ....
    public void DoWork();
}

internal class Helper
{
    private IMyInterface m_member;
    
    public void DoSomething()
    {
        //here i want to call the DoWork method of the base class
        //that does not work because T is not known
        ((MyBaseClass<T>)m_member).DoWork();
    }
}

MyInterface ist ein geschlossenes Interface daran kann ich es nicht packen. Klar ich könnte eine weiteres Interface machen wo ich dann die DoWork Methode rein packe. Ich könnte auch die Helper Klasse generisch machen, um dann das entsprechenden generischen Typen zu haben und einfach casten zu können.

Mein Frage jetzt ist aber, kann ich irgendwie den generischen Typen der Basisklasse raus bekommen, um die Methode ohne Interface bzw. generische Erweiterung zu callen?
Again what learned...
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

mit Reflection kannst du das aber ich würde dir empfehlen ein Interface zu machen, welches das basisinterface erweitert.
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3430
Herkunft: Trier -> München

beantworten | zitieren | melden

Hallo,

schau Dir dazu mal Type.GetGenericTypeDefinition() und Type.GetGenericArguments() an.
Damit solltest an den aktuellen Typen kommen.

Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
private Nachricht | Beiträge des Benutzers
rollerfreak2
myCSharp.de - Member

Avatar #avatar-3271.jpg


Dabei seit:
Beiträge: 928

Themenstarter:

beantworten | zitieren | melden

Da ich nicht auf Reflection zurück greifen will, werd ich wohl eine Interface definieren müssen. Danke für das Feedback.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von rollerfreak2 am .
Again what learned...
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo rollerfreak2,

was heißt müssen? Nur durch das erweiterte Interface hast du die Gewissheit, dass es keine Laufzeitfehler geben kann:

internal interface IMyExtendedInterface : IMyInterface
{
   void DoWork();
}

internal class MyBaseClass<T> : IMyExtendedInterface
{
   // wie gehabt
}

internal class Helper
{
    private IMyExtendedInterface m_member;

    public void DoSomething()
    {
        m_member.DoWork(); // Ganz ohne Cast und ohne die Gefahr von Laufzeitfehlern.
    }
}

herbivore
private Nachricht | Beiträge des Benutzers
rollerfreak2
myCSharp.de - Member

Avatar #avatar-3271.jpg


Dabei seit:
Beiträge: 928

Themenstarter:

beantworten | zitieren | melden

Hallo Herbivore,

das müssen war etwas zu drastisch formuliert. Sollten wäre wohl eher angebracht. Ich hab jetzt ein public Interface eingeführt, welches das private erbt. Dann funzt es natürlich bestens.
Again what learned...
private Nachricht | Beiträge des Benutzers