Das ist gut, danke für die Bestätigungen.
@mkinzler
Das "as" auch "is" macht war mir so im Detail nicht bewusst, aber es macht ja für mich keinen Unterschied wenn ich eine
Exception im Vorfeld verhindern möchte.
Der eigentliche Übeltäter ist wohl ErrorAt():
Delphi-Quellcode:
if (Child <> nil) and not (Child is Parent) then
ErrorAt(Byte(reInvalidCast), ReturnAddress);
Ich wollte mir da was Generisches bauen, so in der Art, und frage mich immer noch ob es den ganzen Aufwand wert ist:
Delphi-Quellcode:
type // Safe type cast from TObject to a derived class, if available, w/o crash
TMyCast<T : class> = class sealed
class function CanCast( Sender : TObject ) : Boolean;
class function TryCast( Sender : TObject; var ACasted : T ) : Boolean;
end;
...
{ TMyCast<T> }
class function TMyCast<T>.CanCast( Sender : TObject ) : Boolean;
begin
Result := False;
if not Assigned( Sender ) then
begin
Exit; //<== GUARD ======================================================
end;
if not ( Sender is T ) then
begin
Exit; //<== GUARD ======================================================
end;
Result := True;
end;
class function TMyCast<T>.TryCast( Sender : TObject; var ACasted : T ) : Boolean;
begin
ACasted := nil;
Result := False;
if not Assigned( Sender ) then
begin
Exit; //<== GUARD ======================================================
end;
if not ( Sender is T ) then
begin
Exit; //<== GUARD ======================================================
end;
ACasted := Sender as T;
Result := True;
end;