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