从 Type1 获取的 Rtti 方法可以在 Type2 的对象上调用

发布于 2025-01-17 04:11:15 字数 347 浏览 1 评论 0原文

我有以下程序。

procedure TForm1.Button1Click(Sender: TObject);
begin
  var con: TRttiContext;
  var meth := con.GetType(TButton).GetMethod('Click');
  meth.Invoke(BitBtn1, []);
end;

BitBtn1 是一个 TBitBtn。如您所见,meth 是从类型 TButton 获取的方法对象。但是,根据我的测试,可以针对 TBitBtn 调用它,没有任何问题。这是预期的吗?

I have the following program.

procedure TForm1.Button1Click(Sender: TObject);
begin
  var con: TRttiContext;
  var meth := con.GetType(TButton).GetMethod('Click');
  meth.Invoke(BitBtn1, []);
end;

BitBtn1 is a TBitBtn. As you can see, meth is a method object got from type TButton. But, by my testing, it can be invoked against a TBitBtn without any issue. Is this expected?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

千鲤 2025-01-24 04:11:15

您发布的 RTTI 之所以有效,是因为 TBitBtnTButton 共享一个共同的祖先 (TCustomButton),它实现了 Click > 方法。

如果您使用的两种类型并非源自实现相同方法的祖先,例如 TEditTMemo,则代码将会失败。两者都允许您输入文本,但 TMemo 具有属性 LinesTEdit 不会,这会导致您发布的代码失败。

The RTTI you've posted works because both TBitBtn and TButton share a common ancestor (TCustomButton) which implements the Click method.

The code would fail if you used two types that didn't descend from an ancestor that implemented the same method, such as TEdit and TMemo. Both allow you to enter text, but TMemo has the property Lines. TEdit does not, which would cause the code you've posted to fail.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文