|
|
导航: |
论坛 -> 移动应用开发
斑竹:flyers,iamdream |
|
作者: |
|
2023/2/12 21:01:40 |
标题: |
|
加入我的收藏 |
楼主: |
比如有个函数hanshu(a:integer;b:string):string; 还有个字符串zifuchuan:string; 让zifuchuan:='hanshu'; 怎么使用zifuchuan间接达到hanshu(1,'fafafa')的效果 c#里面有反射很容易写,delphi的RTTI本人不会用,求高手一下,感谢.
----------------------------------------------
- |
作者: |
|
2023/2/12 22:55:49 |
1楼: |
RTTI其实挺难用的…… 不知道C#实现是啥样子的,你给个代码。
----------------------------------------------
z@S7
|
作者: |
|
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
|
作者: |
|
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
|
作者: |
|
2023/2/13 17:22:27 |
4楼: |
Delphi 的 RTTI 我很少用,2楼厉害了,I'm learning....
----------------------------------------------
-
|
作者: |
|
2023/2/13 18:15:11 |
5楼: |
把代码复制到 Delphi 里面,测试通过。上这个盒子论坛有收获啊。
----------------------------------------------
-
|
作者: |
|
2023/2/13 22:31:36 |
6楼: |
3楼通不过吧
----------------------------------------------
我是菜鸟,己经搞了十多年了,但是我仍然很菜。
|
作者: |
|
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个。 当然大神的东西总有道理,只当是胡言乱语。。。
----------------------------------------------
-
|
|