System::Type - Verwandschaft von Typen?



  • Hallo,
    ich möchte (zur Laufzeit) herausfinden, ob ich einen
    Typ in einen anderen konvertieren kann, habe aber für
    den betreffenden Typ nur ein FieldInfo^ (oder System::Type^).
    Also ob sich Feldtyp in einen Zeiger auf einen bestimmten
    Typ umwandeln lässt (nicht aber das Objekt, auf das gezeigt wird,
    auf welches ich ja mit GetValue zugreifen kann).

    Alex



  • Warum nimmst Du nicht dynamic_cast<Zieltyp> oder habe ich Deine Frage nicht verstanden?



  • witte schrieb:

    Warum nimmst Du nicht dynamic_cast<Zieltyp> oder habe ich Deine Frage nicht verstanden?

    safe_cast<Zieltyp>?



  • safe_cast haut ne Exception , dynamic_cast liefert null. Zum Testen wäre IMHO dynamic_cast sinnvoller.



  • Danke erstmal für die Antworten. Leider ist
    das eben nicht, was ich will.

    Angenommen, ich habe einen unbekannten Typ.
    Jetzt lasse ich mir per GetType()->GetFields()
    die Felder (array<FieldInfo>) geben.
    Für den schnellen Zugriff auf die Felder
    möchte ich den Typen in ein Array konvertieren.
    Ich muss dazu jedoch sicherstellen, dass
    jedes Feld ein Zeiger auf eine Basisklasse
    oder einen davon abgeleiteten Typ ist.
    Also:

    ref class Base {};
    ref class Derived : Base {};

    ref class Unknown
    {
    Derived^ d;
    Base^ b;
    Object^ o; // unsicher
    };

    o könnte auf ein Derived zeigen, also wäre
    Base^ pb = dynamic_cast<Base^>(...->GetValue(...));
    möglich. Aber das nächste mal steht im Object ein String,
    und dann geht das schief... Object ist eben nicht von Base
    abgeleitet.

    Alex



  • Type kennt den Member BaseType. Über diesen kannst Du Dich entlang hangeln.

    Mal ein Quick&Dirty C# Auszug aus einem Projekt von mir:

    public static Type GetGeneration(Type thetype,int generation)
            {
                List<Type> erben = new List<Type>();
                while (thetype != null)
                {
                    erben.Add(thetype);
                    thetype = thetype.BaseType;
                }
    
                erben.Reverse();
    
                // Es sind nicht genug erben da, das wird so nix.
                if (erben.Count - 1 < generation)
                    return null;
    
                return erben[generation];
    
            }
    

    Die Routine hangelt sich durch die Kette und gibt dann einen Bestimmten Typen innerhalb einer Kette zurück. Passt nicht genau auf Dein Problem, aber das anpassen bzw. entnehmen der Info die Du brauchst sollte Trivial sein.



  • Danke, das hatte ich wohl irgendwie übersehen.
    Alex


Anmelden zum Antworten