IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Passage de Propriétés vers Generics


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Responsable R&D
    Inscrit en
    Novembre 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 64
    Points : 43
    Points
    43
    Par défaut Passage de Propriétés vers Generics
    Bonjour,
    j'ai une fonction qui liste toutes les propriétés d'un objet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Procedure QueryPropertyOf(AObj: TObject);
    Var
      vCtx: TRttiContext; // contexte rtti
      vType: TRttiType; // rtti de l'objet
      vProp: TRttiProperty; // rtti de la propriété
    Begin
      vCtx := TRttiContext.Create;
      Try
        vType := vCtx.GetType(AObj.ClassType);
        For vProp In vType.GetProperties Do
          Begin
            //recuperation du vProp pour le passer à la fonction. 
          End;
      Finally
        vCtx.Free;
      End;
    Je voudrais ensuite pour chaque objet le passer en paramètre à une fonction qui a pour paramètre un Generics (<T>)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function TJsonSchema.AddField<T>(const pName: string; const pDescription: string = ''): TJsonField;
    ici les parametres peuvent être des classes ou des elements simples comme des strings ou des integer.
    Quelqu'un sait comment je pourrai passer du TRttiProperty vers <T>

    Ca doit être tout bête mais je ne suis pas encore super à l'aise avec les RTTI.

    Merci de votre aide.

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 733
    Points : 5 401
    Points
    5 401
    Par défaut
    Fait de mémoire alors pas sûr que ça compile direct mais le principe est là.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function RttiTypeToObject(RttiType : TRttiType) : Object;
    var instanceType : TRttiInstanceType;
    begin
        instanceType  := RttiType.AsInstance;
        Result := instanceType.GetMethod('Create').Invoke(instanceType.MetaclassType,[nil]);
    end;

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    ce n'est pas possible, les fonctions "générique" sont créées à la compilation pour chaque "T" utilisé, ce ne sont pas des fonctions dynamiques.

    il faudrait une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function TJsonSchema.AddFieldType(TypeInfo: Pointer; const pName: string; const pDescription: string = ''): TJsonField;
    d'ailleurs j'ai tendance à faire ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function TJsonSchema.AddField<T>(const pName: string; const pDescription: string = ''): TJsonField; inline;
    begin
      Result := AddFieldType(TypeInfo(T), pName, pDescription);
    end;
    du coup le generic est plus un sucre syntaxique qu'autre chose

  4. #4
    Membre du Club
    Homme Profil pro
    Responsable R&D
    Inscrit en
    Novembre 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 64
    Points : 43
    Points
    43
    Par défaut
    Merci Paul et Popo.
    Bon je vais le faire différemment alors en détectant le type et en passant ce qu'il faut manuellement.

Discussions similaires

  1. [AJAX] Passage de Javascript vers AJAX : besoin de qqes conseils !
    Par winnie82 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/08/2007, 14h30
  2. passage de variable vers XML
    Par saidfes dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 16/05/2006, 16h20
  3. Passage de ASP vers PHP
    Par FoxLeRenard dans le forum Langage
    Réponses: 2
    Dernier message: 26/04/2006, 17h15
  4. Passage de paramètres vers un template xsl
    Par Le lag dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 19/04/2006, 18h20
  5. Problème passage Access 97 vers 2000
    Par chris76 dans le forum Access
    Réponses: 7
    Dernier message: 28/03/2006, 11h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo