Ich habe eine Methode, die ein Objekt zurückgeben muss. Natürlich macht es nur Sinn, wenn das T
ein Objekt ist:
Wenn T
kein Objekt ist (z. B. Integer
, String
oder OleVariant
), gibt es nil
zurück und stürzt nicht schrecklich ab.
Wenn wir ein Objekt sind (z. B. TCustomer
, TPatron
, TSalesOrder
, TShape
), können wir das Objekt einfach zurückgeben.
Ich wollte das Problem nicht verwirren; Aber wenn du IEnumerable
betrachtest, wirst du sehen, was gerade passiert.
Ich werde TLama die Antwort kopieren und einfügen lassen, um seine Anerkennung zu erhalten:
%Vor%Ich sehe zwei Hauptoptionen. Wenn der generische Typ ein Klassentyp sein muss und dies zur Kompilierungszeit bekannt ist, sollten Sie eine Einschränkung auf den Typ anwenden:
%Vor%Oder, wenn der Typ von einer bestimmten Klasse abgeleitet werden muss, kann diese Einschränkung wie folgt angegeben werden:
%Vor%Sobald die Einschränkung angewendet wird, ist die direkte Zuweisung alles was Sie brauchen.
%Vor%Dies wird möglich, weil der Compiler die Einschränkung für Ihren generischen Typ erzwingt. Und weiß, dass die Zuweisung für alle möglichen Instanziierungen gültig ist.
Ich würde bemerken, dass es seltsam erscheint, dass eine generische Klasse eine Funktion hat, die TObject
zurückgibt. Warum gibt Ihre Funktion T
nicht zurück?
Wenn Sie nicht beschränken können, dann ist ein einfacher Pointer-Cast der sauberste Ansatz:
%Vor% Offensichtlich müssen Sie überprüfen, ob T
ein Klassentyp ist, Code, für den Sie bereits Mastery demonstriert haben.
Für was es sich lohnt, seit Delphi XE7 ist es einfacher, die Art eines Typs mit System.GetTypeKind
zu überprüfen:
Ja, es kann über TValue gemacht werden, aber es ist nicht der richtige Weg. Ich glaube, es ist viel besser, wenn der Compiler überprüft, ob es ein TObject (oder ein Nachkomme) ist.
%Vor%Dann können Sie es testen:
%Vor%