加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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.

我必须写一个类似的
????intf1.B:= intf3;
要么
????obj1.B = intf3;

使用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例程.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读