Laden...

Basistyp von generischer Klasse bekommen

Erstellt von rollerfreak2 vor 13 Jahren Letzter Beitrag vor 13 Jahren 912 Views
rollerfreak2 Themenstarter:in
916 Beiträge seit 2008
vor 13 Jahren
Basistyp von generischer Klasse bekommen

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

Gelöschter Account
vor 13 Jahren

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

3.170 Beiträge seit 2006
vor 13 Jahren

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

rollerfreak2 Themenstarter:in
916 Beiträge seit 2008
vor 13 Jahren

Da ich nicht auf Reflection zurück greifen will, werd ich wohl eine Interface definieren müssen. Danke für das Feedback.

Again what learned...

49.485 Beiträge seit 2005
vor 13 Jahren

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

rollerfreak2 Themenstarter:in
916 Beiträge seit 2008
vor 13 Jahren

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