DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: wjy13061029975
今日帖子: 3
在线用户: 2
导航: 论坛 -> 移动应用开发 斑竹:flyers,iamdream  
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2023/2/12 21:01:40
标题:
求助反射怎么使用 浏览:995
加入我的收藏
楼主: 比如有个函数hanshu(a:integer;b:string):string;
还有个字符串zifuchuan:string;
让zifuchuan:='hanshu';
怎么使用zifuchuan间接达到hanshu(1,'fafafa')的效果
c#里面有反射很容易写,delphi的RTTI本人不会用,求高手一下,感谢.
----------------------------------------------
-
作者:
男 zhyhero (zhyhero) ★☆☆☆☆ -
盒子活跃会员
2023/2/12 22:55:49
1楼: RTTI其实挺难用的……
不知道C#实现是啥样子的,你给个代码。
----------------------------------------------
z@S7
作者:
男 zhyhero (zhyhero) ★☆☆☆☆ -
盒子活跃会员
2023/2/12 23:16:04
2楼: unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type

  TTools = class
    function hanshu(a: integer; b: string): string;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    function func(funcname: string; param1: integer; param2: string): string;
  end;

var
  Form1: TForm1;

implementation

uses RTTI;

{$R *.dfm}
{ TTools }

function TTools.hanshu(a: integer; b: string): string;
begin
  result := b + a.ToString;
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  t: TTools;
begin
  t := TTools.Create;
  self.Memo1.Lines.Add(t.hanshu(200, 'qwerty'));
  t.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  self.Memo1.Lines.Add(func('hanshu', 100, 'abcdefg'));
end;

function TForm1.func(funcname: string; param1: integer; param2: string): string;
var
  Ctx: TRTTIContext;
  Typ: TRTTIType;
  t: TTools;
  mtd: TRTTIMethod;
  va, vb: TValue;
  vr: TValue;
  r: string;
begin
  result := '';
  t := TTools.Create;
  Ctx := TRTTIContext.Create;
  Typ := Ctx.GetType(t.ClassInfo);
  mtd := Typ.GetMethod(funcname);
  if mtd <> nil then
  begin
    va := TValue.From<integer>(param1);
    vb := TValue.From<string>(param2);
    vr := mtd.Invoke(t, [va, vb]);
    r := vr.AsType<string>;
    result := r;
  end;
  Ctx.Free;
  t.Free;
end;

end.
----------------------------------------------
z@S7
作者:
男 zhyhero (zhyhero) ★☆☆☆☆ -
盒子活跃会员
2023/2/12 23:27:40
3楼: 如果TTools_R为Record类型

  TTools_R = record
    function hanshu(a: integer; b: string): string;
  end;

那么

function TForm1.func_R(funcname: string; param1: integer;
  param2: string): string;
var
  Ctx: TRTTIContext;
  Typ: TRTTIType;
  t: TTools_R;
  mtd: TRTTIMethod;
  va, vb: TValue;
  vr: TValue;
  r: string;
begin
  result := '';
  Ctx := TRTTIContext.Create;
  Typ := Ctx.GetType(typeinfo(TTools_R)); //需要引用TypInfo单元
  mtd := Typ.GetMethod(funcname);
  if mtd <> nil then
  begin
    va := TValue.From<integer>(param1);
    vb := TValue.From<string>(param2);
    vr := mtd.Invoke(@t, [va, vb]);    //用@t
    r := vr.AsType<string>;
    result := r;
  end;
  Ctx.Free;
end;
----------------------------------------------
z@S7
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2023/2/13 17:22:27
4楼: Delphi 的 RTTI 我很少用,2楼厉害了,I'm learning....
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2023/2/13 18:15:11
5楼: 把代码复制到 Delphi 里面,测试通过。上这个盒子论坛有收获啊。
----------------------------------------------
-
作者:
男 inbreak (入侵) ★☆☆☆☆ -
盒子活跃会员
2023/2/13 22:31:36
6楼: 3楼通不过吧
----------------------------------------------
我是菜鸟,己经搞了十多年了,但是我仍然很菜。
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2023/2/14 2:11:56
7楼: @zhyhero非常感谢,我也刚搜到了,大致一样.
----------------------------------------------
-
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2023/2/14 13:48:44
8楼: 看下DELPHI的第三方的ORM框架源代码或者JSON的序列化源代码,可以了解大部分的RTTI运用。
比如delphi-orm(不维护了,替代版是TActivedRecord,是DelphiMVCFrameWork的部分,也可以独立运用),JSON的有JSONDataObject,XSuperObject(XSuperObject代码比较清晰,功能全面,JSONDataObject的性能最强)
DelphiMVCFrameWork封装了JSONDataObject,但是封装的代码真是晦涩难懂。还不如直接用XSuperObject。
XSuperObject不是原来的SuperObject,完全不同的2个。
当然大神的东西总有道理,只当是胡言乱语。。。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行68.35938毫秒 RSS