title: Delphi 2010 RTTI and Interface fields
body: <p>I have a problem with the properties of IInterface type.
  I don't know how to assign values to these properties using RTTI</p>
  
  <p>Here's an example:.</p>
  
  <pre><code>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&lt;IInterface&gt;(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.
  </code></pre>
  
  <p>I have to write an analog of
      intf1.B: = intf3;
  or
      obj1.B = intf3;</p>
  
  <p>using RTTI.</p>
  
  <p>Is this possible?</p>
  
  <p>UPD
  It is work:</p>
  
  <pre><code>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;
  </code></pre>