gpt4 book ai didi

delphi - 如何获取Delphi中作为泛型参数传递的接口(interface)的GUID?

转载 作者:行者123 更新时间:2023-12-02 02:25:38 24 4
gpt4 key购买 nike

下面,Obtain() 方法有效,但 GetAs() 方法对于调用者来说会更简洁。

但是,我不知道如何将接口(interface)作为通用参数传递并获取其 GUID。

声明:

  TInterfaceRegistry = class
private
fRegistry: TDictionary<TGUID, IInterface>;
public
...
procedure Register(const IID: TGUID; IntfObj: IInterface; const Replace: Boolean = False);
function Obtain(const IID: TGUID; out IntfObj): Boolean;
function GetAs<I: IInterface>(): I;
end;

实现:

function TInterfaceRegistry.Obtain(const IID: TGUID; out IntfObj): Boolean;
var
Found: IInterface;
begin
Result := fRegistry.TryGetValue(IID, Found);
if Result then
if not Supports(Found, IID, IntfObj) then
raise EBatSoft.Create(SEBatSoftBug);
end;

function TInterfaceRegistry.GetAs<I>(): I;
begin
if not Obtain(I, Result) then
raise EBatSoft.Create(SEDoesNotImplement);
end;

调用它看起来像这样......

  IntfReg.Register(IMyIntf, TMyImpl.Create);

获取实现:

var
Intf: IMyIntf;
begin
// Less type-safe (can pass anything into 2nd parameter)
if IntfReg.Obtain(IMyIntf, Intf) then
...
// Fully type-safe, and simple
Intf := IntfReg.GetAs<IMyIntf>();

最佳答案

您必须通过 GetTypeData(TypeInfo(I)).GUID 使用类型信息。

请记住,如果您没有为正在使用的给定接口(interface)声明任何 GUID,则这可能会返回空 GUID,而非通用方法根本无法编译。

关于delphi - 如何获取Delphi中作为泛型参数传递的接口(interface)的GUID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65680580/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com