Delphi 2010 RTTI和接口字段
发布时间:2020-12-15 09:50:50 所属栏目:大数据 来源:网络整理
导读:我对IInterface类型的属性有问题. 我不知道如何使用RTTI为这些属性赋值 这是一个例子: program Project2;uses Forms,RTTI,Windows,TypInfo;{$R *.res}type ITestInterfacedClass = interface ['{25A5B554-667E-4FE4-B932-A5B8D9052A17}'] function GetA: IT
我对IInterface类型的属性有问题.
我不知道如何使用RTTI为这些属性赋值 这是一个例子: program Project2; uses Forms,RTTI,Windows,TypInfo; {$R *.res} type ITestInterfacedClass = interface ['{25A5B554-667E-4FE4-B932-A5B8D9052A17}'] function GetA: ITestInterfacedClass; procedure SetA(const Value: ITestInterfacedClass); property A: ITestInterfacedClass read GetA write SetA; function GetB: ITestInterfacedClass; procedure SetB(const Value: ITestInterfacedClass); property B: ITestInterfacedClass read GetB write SetB; end; TTestInterfacedClass = class(TInterfacedObject,ITestInterfacedClass) private FA: ITestInterfacedClass; FB: ITestInterfacedClass; function GetA: ITestInterfacedClass; function GetB: ITestInterfacedClass; procedure SetA(const Value: ITestInterfacedClass); procedure SetB(const Value: ITestInterfacedClass); public property A: ITestInterfacedClass read GetA write SetA; property B: ITestInterfacedClass read GetB write SetB; end; { ITestInterfacedClass } .... procedure SetProperty(aLeft: TObject {IInterface}; aNameProp: string; aRight: IInterface); var RttiContext: TRttiContext; RttiType: TRttiType; RTTIProperty: TRttiProperty; begin RttiContext := TRttiContext.Create; RTTIType := RttiContext.GetType(TTestInterfacedClass); RTTIProperty := RTTIType.GetProperty(aNameProp); if RTTIProperty.PropertyType.TypeKind = tkInterface then RTTIProperty.SetValue(aLeft,TValue.From<IInterface>(aRight)); end; var obj1: TTestInterfacedClass; intf1,intf2,intf3: ITestInterfacedClass; begin obj1 := TTestInterfacedClass.Create; intf1 := obj1; intf2 := TTestInterfacedClass.Create; intf3 := TTestInterfacedClass.Create; intf1.A := intf2; // intf1.B := intf3; SetProperty(obj1,'B',intf3); end. 我必须写一个类似的 使用RTTI. 这可能吗? UPD procedure SetProperty(aLeft: TObject; aNameProp: string; aRight: IInterface); var RttiContext: TRttiContext; RttiTypeInterface: TRttiInterfaceType; RTTIProperty: TRttiProperty; Value: TValue; begin RttiContext := TRttiContext.Create; RTTIType := RttiContext.GetType(aLeft.ClassType); RTTIProperty := RTTIType.GetProperty(aNameProp); if RTTIProperty.PropertyType.TypeKind = tkInterface then begin TValue.Make(@aRight,RTTIProperty.PropertyType.Handle,Value); RTTIProperty.SetValue(aLeft,Value); end; end; 解决方法
不幸的是,这不起作用,因为RTTI.pas中的接口转换代码不调用QueryInterface.如果您使用TValue.From< IInterface>放入TValue,则无法将其转换为不同接口类型的TValue,即使接口支持该类型.随意将其提交给QC.
使用TValue.From创建TValue< ITestInterfacedClass>但确实有用.但是你不能使用简单的SetProperty例程. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |