查询未知接口类型

时间:2009-11-12 17:53:26

标签: delphi generics delphi-2010

在此代码中:

TTest<IntfT: IInterface> = class
protected
  fObj : TInterfacedObject;
public
  function  GetVal: IntfT;
end;

如果我希望它将fObj作为IntfT返回,我将如何实现GetVal函数?

我试过了:

result := fObj as IntfT;

fObj.QueryInterface(IntfT,result);

result := fObj as IInterface;

但似乎没有任何效果。这看起来很简单,我一直在想我必须遗漏一些东西。

有什么想法吗?

修改

对我来说最有希望的是QueryInterface。目前编译器抱怨IntfT不是GUID,我得到的印象是,如果我有适当的GUID,一切都会很高兴。任何人都知道从这种情况下可以使用的接口类型获取IID的方法吗?

2 个答案:

答案 0 :(得分:2)

result := fObj as IntfT;应该可以工作,但显然编译器并不完全理解接口作为泛型。你应该在质量控制中报告这个。

fObj.QueryInterface(IntfT,result);不起作用,因为QueryInterface是TInterfacedObject的受保护成员。此外,QueryInterface通过调用GetInterface来查找GUID,而GUID和泛型不能很好地混合。

result := fObj as IInterface;适合我编译。你有什么问题吗?

答案 1 :(得分:2)

以下是我提出的解决方案:

function TTest<IntfT>.GetVal: IntfT;
begin
  fObj.QueryInterface(GetTypeData(TypeInfo(T)).Guid,result);
end;

这似乎有效。 (顺便说一下,它的工作原理是因为fObj实际上不是TInterfacedObject,而是实现具有公共QueryInterface方法的类的不同接口)。