对于一个框架,我编写了一个包装器,它接受任何对象,接口或记录类型来探索其属性或字段.类声明如下:
TWrapper<T> = class
private
FType : TRttiType;
FInstance : Pointer;
{...}
public
constructor Create (var Data : T);
end;
Run Code Online (Sandbox Code Playgroud)
在构造函数中,我尝试获取进一步处理步骤的类型信息.
constructor TWrapper<T>.Create (var Data : T);
begin
FType := RttiCtx.GetType (TypeInfo (T));
if FType.TypeKind = tkClass then
FInstance := TObject (Data)
else if FType.TypeKind = tkRecord then
FInstance := @Data
else if FType.TypeKind = tkInterface then
begin
FType := RttiCtx.GetType (TObject (Data).ClassInfo); //<---access violation
FInstance := TObject (Data);
end
else
raise Exception.Create ('Unsupported type');
end;
Run Code Online (Sandbox Code Playgroud)
我想知道这个访问冲突是否是delphi编译器中的错误(我正在使用XE).在进一步调查之后,我写了一个简单的测试函数,它表明,要求类名也会产生这个异常:
procedure TestForm.FormShow (Sender …Run Code Online (Sandbox Code Playgroud)