在 delphi 中从 RTTI 返回 ObjectList
Returning an ObjectList from RTTI in delphi
我正在一个对象内部调用方法,我试图以我正在做的方式保持非常动态,但我遇到了一个问题,我的 return 类型是一些对象的列表,我考虑过使用 TObjectList 现在的问题是 rtti returns 是一个 TValue,我不完全理解如何将它转换为 TObjectList。我认为将 TValue 转换为 TObject,因为理论上 TObjectList 是一个对象,但它没有用。你们知道我怎样才能做到这一点吗?
这就是我所说的功能。
function TMyClass.ExecMethodAndRet(MethodName: string;
Args: array of TValue): TObjectList<TObject>;
var
R : TRttiContext;
T : TRttiType;
M : TRttiMethod;
begin
T := R.GetType(FMyObject.ClassInfo);
for M in t.GetMethods do
if (m.Parent = t) and (UpperCase(m.Name) = UpperCase(MethodName))then
begin
result := M.Invoke(FMyObject, Args); <- problem here can't cast to TObjectList
end;
end;
Return:
Result := M.Invoke(Self, Args).AsType<TObjectList<TObject>>;
P.S。不要忘记初始化 return 值,最好是在函数体的开头。
您需要使用正确的参数在 TValue
上调用 AsType
。 (参见 doc)
如果你确实有 TObjectList<TObject>
那么这应该通过。如果你有一些 TObjectList<T>
其中 T 是其他一些 class 你需要像这样做一个 hardcast:
Result := TObjectList<TObject>(M.Invoke(FMyObject, Args).AsObject);
这样做基本上是假协方差。但是请记住,因为您可以将对象添加到返回的 TObjectList<TObject>
中,所以您正在失去关于它真正具有的元素类型的类型安全性,并且列表本身不会检查它。 (参见 my article about co- and contravariance)。
我正在一个对象内部调用方法,我试图以我正在做的方式保持非常动态,但我遇到了一个问题,我的 return 类型是一些对象的列表,我考虑过使用 TObjectList 现在的问题是 rtti returns 是一个 TValue,我不完全理解如何将它转换为 TObjectList。我认为将 TValue 转换为 TObject,因为理论上 TObjectList 是一个对象,但它没有用。你们知道我怎样才能做到这一点吗?
这就是我所说的功能。
function TMyClass.ExecMethodAndRet(MethodName: string;
Args: array of TValue): TObjectList<TObject>;
var
R : TRttiContext;
T : TRttiType;
M : TRttiMethod;
begin
T := R.GetType(FMyObject.ClassInfo);
for M in t.GetMethods do
if (m.Parent = t) and (UpperCase(m.Name) = UpperCase(MethodName))then
begin
result := M.Invoke(FMyObject, Args); <- problem here can't cast to TObjectList
end;
end;
Return:
Result := M.Invoke(Self, Args).AsType<TObjectList<TObject>>;
P.S。不要忘记初始化 return 值,最好是在函数体的开头。
您需要使用正确的参数在 TValue
上调用 AsType
。 (参见 doc)
如果你确实有 TObjectList<TObject>
那么这应该通过。如果你有一些 TObjectList<T>
其中 T 是其他一些 class 你需要像这样做一个 hardcast:
Result := TObjectList<TObject>(M.Invoke(FMyObject, Args).AsObject);
这样做基本上是假协方差。但是请记住,因为您可以将对象添加到返回的 TObjectList<TObject>
中,所以您正在失去关于它真正具有的元素类型的类型安全性,并且列表本身不会检查它。 (参见 my article about co- and contravariance)。