我有一些數據類型:是否有可能在Delphi中編寫這個泛型?
type
TICD10CodeMap = TObjectDictionary<string, TICD10LookupResult>;
TStringMap = TDictionary<string, string>;
TFMRecMap = TDictionary<string, TFilemanRecord>;
而且他們的一些情況:
var
FICD10Codes: TICD10CodeMap;
FPatientTypes: TStringMap;
FPOVs: TFMRecMap;
FTreatmentTypes: TStringMap;
FTypesOfCare: TStringMap;
而且我有一個方法,這是愉快地填充它們,使用它們的添加方法,直到我發現我的數據源可能有重複的鍵。
現在我可以只寫用的containsKey每個代碼之前,每添加(),並做一些事情,但我想我會是聰明的:
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;
但似乎我對德爾福太聰明瞭。首先,在函數定義的主體中投射,看起來應該是不必要的,然後有一個事實,即當我嘗試調用AddPair
時,會出現編譯器錯誤。天真AddPair(s3, s2, FPatientTypes)
讓我既
[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>'
,而想成爲-更復雜AddPair<string, TStringMap>(s3, s2, FPatientTypes)
抱怨
[dcc32 Error] uReverseVistaLookups.pas(127): E2515 Type parameter 'ValType' is not compatible with type 'System.Generics.Collections.TDictionary<System.string,System.string>'
有一些咒語,我很想念,這將使德爾福出了什麼事情我試圖在這裏做?
這似乎並不需要一個通用的方法。你已經實例化了泛型類型。使用在問題的第一個代碼塊中聲明的類型別名。 –
@DavidHeffernan不,我想要一個單一的標識符,我可以將所有調用替換爲各種容器的添加方法。我已經回答了我自己,見下文。 – wades
那你爲什麼要申報這些類型? –