Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何将接口变量分配给Rtti.TValue类型的变量_Delphi_Delphi 2010_Rtti - Fatal编程技术网

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

Delphi 如何将接口变量分配给Rtti.TValue类型的变量,delphi,delphi-2010,rtti,Delphi,Delphi 2010,Rtti,目前,我对delphi2010进行了试验,发现了Rtti单元的TValue类型。TValue具有非常有趣的特性,但我找不到分配接口的方法 我尝试以下方法 program Project1; uses Classes, SysUtils, Rtti; var list : IInterfaceList; value : TValue; begin // all these assignments works value := 1; value := 'Hello';

目前,我对delphi2010进行了试验,发现了Rtti单元的TValue类型。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.
程序项目1;
使用
类、SysUtils、Rtti;
变量
列表:界面列表;
价值:TValue;
开始
//所有这些作业都有效
值:=1;
值:='Hello';
值:=TObject.Create;
//但这些任务都不起作用
列表:=TInterfaceList.Create;
值:=列表;//[DCC Fehler]Project1.dpr(15):E2010不兼容类型:“TValue”和“IInterfaceList”
值。从[列表];//[DCC Fehler]Project1.dpr(16):E2531方法“From”需要显式类型参数
值。从[列表];//[DCC Fehler]项目1.dpr(17):E2035参数不足
结束。

我找不到任何进一步的信息。不在delphi帮助系统中,也不在internet上。我做错了什么?

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

Value := TValue.From<IInterfaceList>(list);
Value:=TValue.From(列表);

这是该程序的工作版本:

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.

值得指出的是,对于像这样简单的类型良好的参数列表,类型推断应该可以很好地工作,并且
TValue.From(list)
应该足够了。感谢Mason和Barry,我已经花了2个小时来寻找解决方案。很难意识到Codeinsight只是在跟我开玩笑。
TValue.From(list)
TValue.From(列表)更简单,可读性更强