私はいくつかのデータ型があります。このジェネリックを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<string, TStringMap>(s3, s2, FPatientTypes)
は何Iのうち、デルファイになるだろう、私は欠けているいくつかの呪文が、そこには約
[dcc32 Error] uReverseVistaLookups.pas(127): E2515 Type parameter 'ValType' is not compatible with type 'System.Generics.Collections.TDictionary<System.string,System.string>'
を文句を言いながら、素朴な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>'
を取得しますここでやろうとしてるの?
これは一般的な方法を必要としていません。すでにジェネリック型をインスタンス化しています。質問内の最初のコードブロックで宣言した型エイリアスを使用します。 –
@DavidHeffernanいいえ、私はすべての呼び出しを置き換えて、コンテナのコンテナのAddメソッドへの単一の識別子を持つことができます。私は自分自身に答えました、以下を参照してください。 – wades
どうしてそれらのタイプを宣言しましたか? –