TObject
sの配列をリストに挿入する必要があるプロシージャがあります。リストはサポートされているタイプ、例えばのいずれかであることができTObjectList
、TObjectList<T>
、TROArray
、など
手順は次のようになります。
type
TObjectArray = Array of TObject;
...
procedure TMyClass.DoAssignObjectList(const ObjectArray: TObjectArray;
const DstList: TObject);
var
i: Integer;
begin
if DstList is TObjectList then
begin
for i := 0 to pred(TObjectList(DstList).Count) do
TObjectList(DstList).Add(ObjectArray[i]);
end else
if DstList is TObjectList<T> then // Obviously this doesn't work
begin
for i := 0 to pred(TObjectList<T>(DstList).Count) do
TObjectList<T>(DstList).Add(ObjectArray[i]);
end
else
begin
raise Exception.CreateFmt(StrNoDoAssignORMObject, [DstList.ClassName]);
end;
end;
オブジェクトがであるかどうかを確認してTObjectList<T>
から、配列の要素をオブジェクトに追加するにはどうすればよいですか?
ジェネリック型に関する詳細情報を取得するには、少しRTTIを使用する必要があります。
次のコードは、そのためのいくつかのメソッドを持つSpring4Dを使用しています。
uses
...
Spring.Reflection;
procedure DoAssignObjectList(const ObjectArray: TObjectArray;
const DstList: TObject);
function IsGenericTObjectList(const obj: TObject): Boolean;
var
t: TRttiType;
begin
t := TType.GetType(obj.ClassInfo);
Result := t.IsGenericType and (t.GetGenericTypeDefinition = 'TObjectList<>');
end;
begin
...
if IsGenericTObjectList(DstList) then
begin
for i := 0 to pred(TObjectList<TObject>(DstList).Count) do
TObjectList<TObject>(DstList).Add(ObjectArray[i]);
...
end;
さらに、リストの汎用パラメータータイプに関する情報を取得して、リストに入力するオブジェクトが要件に一致しているかどうかを確認することもできます(もちろん、汎用タイプでのみ機能します)。
function GetGenericTObjectListParameter(const obj: TObject): TClass;
var
t: TRttiType;
begin
t := TType.GetType(obj.ClassInfo);
Result := t.GetGenericArguments[0].AsInstance.MetaclassType;
end;
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加