- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有界面:
TOnIntegerValue: function: integer of object;
ITestInterface = interface(IInvokable)
['{54288E63-E6F8-4439-8466-D3D966455B8C}']
function GetOnIntegerValue: TOnIntegerValue;
procedure SetOnIntegerValue(const Value: TOnIntegerValue);
property OnIntegerValue: TOnIntegerValue read GetOnIntegerValue
write SetOnIntegerValue;
end;
在我的测试中我有:
.....
FTestInterface: ITestInterface;
.....
procedure Test_TestInterface.SetUp;
begin
FTestInterface := TVirtualInterface.Create(TypeInfo(ITestInterface)) as ITestInterface;
end;
.....
并得到错误:“范围检查错误”
有什么想法吗?或者 TVirtualInterface 不支持“对象函数”和“对象过程”类型?谢谢!!
最佳答案
看起来TVirtualInterface
可以很好地处理方法指针,但不喜欢属性。下面是一个用于演示的快速示例:
{$APPTYPE CONSOLE}
uses
SysUtils, Rtti;
type
TIntegerFunc = function: integer of object;
IMyInterface = interface(IInvokable)
['{8ACA4ABC-90B1-44CA-B25B-34417859D911}']
function GetValue: TIntegerFunc;
// property Value: TIntegerFunc read GetValue; // fails with range error
end;
TMyClass = class
class function GetValue: Integer;
end;
class function TMyClass.GetValue: Integer;
begin
Result := 666;
end;
procedure Invoke(Method: TRttiMethod; const Args: TArray<TValue>; out Result: TValue);
begin
Writeln(Method.ToString);
Result := TValue.From<TIntegerFunc>(TMyClass.GetValue);
end;
var
Intf: IMyInterface;
begin
Intf := TVirtualInterface.Create(TypeInfo(IMyInterface), Invoke) as IMyInterface;
Writeln(Intf.GetValue()); // works fine
// Writeln(Intf.Value()); // fails with range error
Readln;
end.
该程序按预期工作。然而,取消对该属性的注释就足以使其失败。这显然是一个 RTTI 错误。我认为除了 Embarcadero 之外,没有任何人可以解决这个问题。
看起来问题在于类型为方法指针的属性的组合。解决方法是避免此类属性。我建议你提交一份QC报告。此答案中的代码正是您所需要的。
关于delphi - TVirtualInterface 失败,接口(interface)包含 "function of object"属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15387192/
如何在 TVirtualInterface 类的 OnInvoke 方法中获取 Method: TRttiMethod 的所有权属性? 我有这个界面: IPerson = interface(IInv
豪迪, 我正在使用 TVirtualInterface 来实现一些接口(interface)。这些接口(interface)代表可以在数据库中找到的键。我使用定制的代码生成器生成接口(interfac
我有界面: TOnIntegerValue: function: integer of object; ITestInterface = interface(IInvokable) ['{5428
我正在尝试使用 TVirtualInterface。我主要尝试遵循 Embarcadero doc wiki 中的示例。并在 Nick Hodges' blog . 但是,我想做的与标准示例有点不同。
我是一名优秀的程序员,十分优秀!