【问题标题】:How can I assign an interface variable to a variable of type Rtti.TValue如何将接口变量分配给 Rtti.TValue 类型的变量
【发布时间】:2009-09-06 15:47:00
【问题描述】:

目前我给delphi2010试用了一下,发现Rtti Unit的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.

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

【问题讨论】:

    标签: delphi delphi-2010 rtti


    【解决方案1】:

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

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

    【讨论】:

    • 值得指出的是,对于像这样简单的类型良好的参数列表,类型推断应该可以正常工作,TValue.From(list) 应该足够了。
    • 感谢 Mason 和 Barry,我已经尝试了 2 个小时来找到解决方案。很难意识到 Codeinsight 只是在开玩笑。
    【解决方案2】:

    这是该程序的工作版本:

    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); 比TValue.From&lt;IInterfaceList&gt;(list); 更简单、更易读
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多