我注意到TVirtualInterface类有一个奇怪的错误。 我试过以下的事情:
ITest1 = interface
procedure Test1();
End;
ITest2 = Interface(ITest1)
procedure Test2();
End;
ITest3 = Interface(ITest2)
procedure Test3();
ENd;
procedure Test();
var
test : ITest3;
begin
test := TVirtualInterface(TypeInfo(ITest3),
procedure(Method: TRttiMethod;
const Args: TArray<TValue>; out Result: TValue)
begin
showMessage(Method.Name);
end) as ITest3;
test.test1();
test.test2();
test.test3();
End;
上面的代码运行正常。如果我改变它:
ITest3 = Interface(ITest2)
procedure Test3();
function GetLabel : string;
property Label : string read GetLabel;
ENd;
我打电话:
showmessage(test.Label);
......它仍然有效。
但是如果我将此属性移动到ITest2或ITest1,调用任何ITest1,ITest2或ITest3的方法将调用错误的方法(例如test.Test2()将显示“Test3”),要么崩溃(访问违规)。
对此有何解释和/或解决方法?
修改&gt;&gt;对不起,实际上它实际上似乎只有这种属性失败:
property Item[Name : string] : X read GetX write SetX;
答案 0 :(得分:2)
这是Delphi XE3编译器中的错误,它已在XE4中修复
Fix list for RAD Studio XE4 104613 TVirtualInterface:接口中索引属性的TRttiMethod
答案 1 :(得分:0)
您是否尝试从IInvokable
继承接口,并为其提供GUID,如Embarcadero example
我猜是接口RTTI存在一些问题,如果它不是从IInvokable
继承的