使用Delphi RTTI获取接口的字符串名称
我已经证明,我可以使用Delphi 2010从其GUID获取接口的名称(例如,将IMyInterface转换为字符串“IMyInterface”。我希望在Delphi 7中实现这一点(为了兼容性)。这是可能的吗?或者存在基本的编译器限制。在Delphi 7中,您应该构建自己的从GUID到RTTI(或名称)的映射。没有像Delphi 2010中那样的RTTI上下文。我广泛使用RIIT,通常在单元的初始化部分中央某处“注册”所有感兴趣的类型,并根据typeinfo指针从那里查找所有类型。这适用于D7、D2007和D2010(但如果需要创建它,则需要更多的工作)。此外,您可能会忘记注册类型,并想知道为什么找不到某个名称。是的,您可以获得该名称,下面使用IExample类型演示如何获得名称。 旧的Delphi 7 RTTI是通过TypInfo单元完成的使用Delphi RTTI获取接口的字符串名称,delphi,interface,rtti,Delphi,Interface,Rtti,我已经证明,我可以使用Delphi 2010从其GUID获取接口的名称(例如,将IMyInterface转换为字符串“IMyInterface”。我希望在Delphi 7中实现这一点(为了兼容性)。这是可能的吗?或者存在基本的编译器限制。在Delphi 7中,您应该构建自己的从GUID到RTTI(或名称)的映射。没有像Delphi 2010中那样的RTTI上下文。我广泛使用RIIT,通常在单元的初始化部分中央某处“注册”所有感兴趣的类型,并根据typeinfo指针从那里查找所有类型。这适用于D7
program Project6;
{$APPTYPE CONSOLE}
uses
SysUtils,TypInfo;
type
IExample = interface
['{4902F666-F3FC-4999-BD8C-F226851201D6}']
procedure blah;
end;
begin
Writeln(GetTypeName(TypeInfo(IExample)));
readln
end.
刚刚注意到您说您希望从GUID而不仅仅是类型获取它。这需要类型的GUID注册表。可以使用Delphi 7中的RTTI来获取类型
下面将以IExample返回guid为例
Writeln(GUIDToString(GetTypeData(TypeInfo(IExample)).Guid));
下面是一个将接口的TypeInfo()映射到其GUID的注册表示例。
它可以优化,但我这样做是为了说明这个概念
unit Unit11;
interface
uses
TypInfo,SysUtils, Contnrs;
type
TGuidMap = class(TObject)
Guid : TGUID;
TypeInfo : PTypeInfo;
end;
procedure RegisterInterface(InterfaceType : PTypeInfo);
function GetInterfaceType(Guid : TGUID) : PTypeInfo;
implementation
var
GuidMapList : TObjectList;
procedure RegisterInterface(InterfaceType : PTypeInfo);
var
Map : TGuidMap;
begin
Map := TGuidMap.Create;
Map.TypeInfo := InterfaceType;
Map.Guid := GetTypeData(InterfaceType).Guid;
GuidMapList.Add(Map);
end;
function GetInterfaceType(Guid : TGUID) : PTypeInfo;
var
I : Integer;
begin
result := nil;
for I := 0 to GuidMapList.Count - 1 do
begin
if IsEqualGUID(TGuidMap(GuidMapList.Items[I]).Guid,Guid) then
begin
result := TGuidMap(GuidMapList.Items[I]).TypeInfo;
break;
end;
end;
end;
Initialization
GuidMapList := TObjectList.Create(true);
finalization
GuidMapList.Free;
end.
要将项目添加到注册表,您需要调用
RegisterInterface(TypeInfo(IExample));