如何将接口变量分配给Rtti.TValue类型的变量

Hei*_* Z. 2 delphi rtti delphi-2010

目前我给delphi2010一个试验,发现了TVtue类型的Rtti单元.TValue具有非常有趣的功能,但我找不到分配界面的方法.

我尝试以下方法

program Project1;
uses
  Classes, SysUtils, Rtti;
var
   list : IInterfaceList;
   value : TValue;
begin
  // all these assignments works
  value := 1;
  value := 'Hello';
  value := TObject.Create;

  // but nothing of these assignments works
  list := TInterfaceList.Create;
  value := list; // [DCC Fehler] Project1.dpr(15): E2010 incompatible types: 'TValue' and 'IInterfaceList'
  value.From[list]; // [DCC Fehler] Project1.dpr(16): E2531 Method 'From' requires explicit typarguments
  value.From<IInterfaceList>[list]; // [DCC Fehler] Project1.dpr(17): E2035 Not enough parameters
end.
Run Code Online (Sandbox Code Playgroud)

我找不到任何进一步的信息.不是在delphi帮助系统而不是在互联网上.我做错了什么?

Bar*_*lly 7

这是该程序的工作版本:

program Project1;
uses
  Classes, SysUtils, Rtti;
var
   list : IInterfaceList;
   value : TValue;
begin
  // all these assignments works
  value := 1;
  value := 'Hello';
  value := TObject.Create;

  // but nothing of these assignments works
  list := TInterfaceList.Create;
  value := TValue.From(list);
end.
Run Code Online (Sandbox Code Playgroud)


Mas*_*ler 6

你的最后一次尝试是最接近的.TValue.From是一个类函数,它从参数创建一个TValue.你可能把方括号放在那里,因为这是CodeInsight展示的方式,对吧?这实际上是CodeInsight的一个小故障; 它适用于基于泛型的函数,您应该使用括号.正确的语法如下所示:

Value := TValue.From<IInterfaceList>(list);
Run Code Online (Sandbox Code Playgroud)

  • 值得指出的是,对于像这样的简单类型好的参数列表,类型推断应该可以正常工作,并且`TValue.From(list)`应该足够了. (2认同)