2009-09-06 6 views
2

Pour l'instant je donne un essai à delphi2010 et trouvé le type TValue de l'unité Rtti. TValue a des fonctionnalités très interessantes, mais je n'arrive pas à trouver un moyen d'assigner une interface.Comment puis-je affecter une variable d'interface à une variable de type Rtti.TValue

J'essaie les suivantes

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. 

Je ne peux pas trouver de plus amples informations. Pas dans le système d'aide Delphi et pas sur Internet. Qu'est-ce que je fais de mal?

Répondre

6

Votre dernier essai est le plus proche. TValue.From est une fonction de classe qui crée une TValue à partir d'un paramètre. Vous avez probablement mis les crochets dedans parce que c'est ce que CodeInsight a montré, n'est-ce pas? C'est en fait un petit problème dans CodeInsight; il le fait pour les fonctions génériques, où vous devriez utiliser des parenthèses à la place. La syntaxe ressemble à ceci:

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

Il est intéressant de souligner que pour de simples listes d'arguments bien typés comme celui-ci, l'inférence de type devrait fonctionner correctement, et 'TValue.From (list)' devrait suffire. –

+0

Merci Mason et Barry, j'ai essayé pendant 2 heures pour trouver une solution. Il est difficile de réaliser que Codeinsight se moquait de moi. –

7

Ceci est une version de travail du programme:

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. 
+0

'TValue.From (list);' est plus simple et plus lisible que 'TValue.From (liste);' –

Questions connexes