Ich habe einige Datentypen:Ist es möglich, dieses generische in Delphi zu schreiben?
type
TICD10CodeMap = TObjectDictionary<string, TICD10LookupResult>;
TStringMap = TDictionary<string, string>;
TFMRecMap = TDictionary<string, TFilemanRecord>;
Und einige Beispiele davon:
var
FICD10Codes: TICD10CodeMap;
FPatientTypes: TStringMap;
FPOVs: TFMRecMap;
FTreatmentTypes: TStringMap;
FTypesOfCare: TStringMap;
Und ich hatte eine Methode, die sie glücklich war bevölkern, ihre Methoden hinzufügen verwenden, bis ich, dass meine Daten entdeckt Quelle könnte doppelte Schlüssel enthalten.
Jetzt konnte ich nur schreiben Code mit ContainsKey vor jedem Add() und etwas tun, aber ich dachte, dass ich klug wäre:
procedure AddPair<ValType, DictType: TDictionary<string, ValType>>
(Key: string; Val: ValType;
Dict: DictType);
begin
if (Dict as TDictionary<string, ValType>).ContainsKey(Key) then
AddPair('Copy of ' + Key, Val, Dict)
else
Dict.Add(Key, Val);
end;
Aber es scheint, dass ich für Delphi zu klug bin. Zunächst einmal gibt es die Besetzung in dem Körper der Funktionsdefinition, die sollte wie es scheint nicht notwendig sein, dann gibt es die Tatsache, dass, wenn ich versuche AddPair
zu nennen, ich Compiler-Fehler erhalten. Die naive AddPair(s3, s2, FPatientTypes)
wird mir beide
[dcc32 Error] uReverseVistaLookups.pas(116): E2010 Incompatible types: 'ValType' and 'string'
[dcc32 Error] uReverseVistaLookups.pas(116): E2010 Incompatible types: 'DictType' and 'System.Generics.Collections.TDictionary<System.string,System.string>'
während die Möchtegern-mehr-sophisticated AddPair<string, TStringMap>(s3, s2, FPatientTypes)
beschwert sich über
[dcc32 Error] uReverseVistaLookups.pas(127): E2515 Type parameter 'ValType' is not compatible with type 'System.Generics.Collections.TDictionary<System.string,System.string>'
Gibt es eine Beschwörung, die ich fehle, die Delphi machen würde von dem, was ich versuche ich hier zu machen?
Dies scheint nicht eine generische Methode zu müssen. Sie haben die generischen Typen bereits instanziiert. Verwenden Sie die Typaliase, die Sie im ersten Codeblock der Frage deklarieren. –
@DavidHeffernan nein, ich will eine einzige Kennung haben, mit dem ich alle Anrufe an die Add-Methoden der verschiedenen Container ersetzen kann. Ich habe mir selbst geantwortet, siehe unten. – wades
Warum haben Sie diese Typen deklariert? –