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

C# Discussion :

problème généricité et clonage


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut problème généricité et clonage
    voilà j'ai la fonction suivante dans mon code:

    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
    public static object GetEntitySnapShot(string connectionString, Type entityType, object id)
            {
                SessionMagager sessionManager = new SessionMagager(connectionString);
                ISession session = sessionManager.BuildSession();
     
                object entityObject = session.Load(entityType, id);
     
                ICloneable entityAsCloneable = (ICloneable) entityObject;
     
                ICloneable returnObject = (ICloneable)entityAsCloneable.Clone();
     
                sessionManager.ReleaseSession(session);
     
                return returnObject;
            }
    Le but de cette fonction est de créer le clone d'une instance de classe qui elle est lièe à une base de donnée et qui est donc invalide dès que je ferme la session.
    Cette fonction est très jolie, mais elle ne marche pas. En effet en utilisant le type ICloneable, je ne connais pas le vrai type, donc l'opération de clonage ne fonctionne pas.

    J'ai essayer de mettre en place une stratégie utilisant les templates mais je ne m'en sort pas.

    Quelqu'un a-t-il un idée de comment faire ?

    les contraintres étant les suivantes:
    - faire une fonction générique (qui fonctione quelquesoit le type de l'entité à charger)

    - donner en sortie de fonction une instance d'un objet que l'utilisateur pourra utiliser et alterer sans modifier la base. (donc pas l'objet resultat de l'appel à session.Load, mais une copie conforme de cette objet)

    - session.Load a pour prototype object Load (System.Type, Object) et ne peut être modifié.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    C'est quoi exactement qui marche pas ?

  3. #3
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    Je ne sais pas ce que sont ces objets c'est donc dur à dire mais est-ce que l'utilisation d'une signature générique plus typée apporte quelque chose?

    public static TEntity GetEntitySnapShot(string connectionString, TEntity objectToClone) where TEntity : EntityBase

    En supposant qu'EntityBase est la classe de base des entités ou une interface commune, cela donnerait directement accès aux fonctionnalités de base de l'objet.
    Mais encore une fois, sans savoir le mécanisme de ton outil (qui ressemble a un ORM) je saurai pas dire.

  4. #4
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut
    Ce qui ne marche pas, c'est que le compilo ne connait pas le type réel, donc le clonage ne clone rien du tout.
    si c'est la fonction load que tu désignes comme outil, je suppose qu'elle fonctionne avec de la reflexion, car il s'agit de la fonction Load de la classe session de NHibernate.

  5. #5
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    parce qu'en fait, si tu te mets en débug et que tu analyse le contenu de
    object entityObject, c'est quoi le type exact?

  6. #6
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut
    object entityObject = session.Load(entityType, id);

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    C'est quelque chose comme cela que tu veux ?



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public static TEntity GetEntitySnapShot<TEntity>(string connectionString, object id) where TEntity :class
            {
              SessionMagager sessionManager = new SessionMagager(connectionString);
                ISession session = sessionManager.BuildSession();
     
                TEntity entityObject = session.Load(typeof(TEntity), id);
     
                ICloneable returnObject = (ICloneable)(entityObject as ICloneable).Clone();
     
                sessionManager.ReleaseSession(session);
     
                return (returnObject as TEntity);
            }

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Je plussoie Bluedeep, juste, ajouter une contrainte ICloneable sur TEntity, comme ca pas besoin de caster deux fois la variable (puis on evite d'avoir le cas ou la methode est utilisée sur un type non cloneable).

  9. #9
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut
    oui ça y ressemble, mais ma connaissance du langage n'était pas sufisante je ne connaissait pas cette possibilité. Heureusement vous êtes là
    Comment on ajoute la contranite pour ICloneable ?

  10. #10
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par BigNic Voir le message
    oui ça y ressemble, mais ma connaissance du langage n'était pas sufisante je ne connaissait pas cette possibilité. Heureusement vous êtes là
    Comment on ajoute la contranite pour ICloneable ?
    Remplacer


    Par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    where TEntity :class, ICloneable
    


    C'est une contrainte "compile-time".

  11. #11
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut
    Finalement j'ai mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where TEntity : ICloneable
    Et cela fonctionne, mais merci de ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème généricité sur ArrayList
    Par Jb_One73 dans le forum Collection et Stream
    Réponses: 27
    Dernier message: 23/02/2015, 19h49
  2. Problème lors du clonage d'un élément
    Par Anthares dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 18/03/2010, 12h02
  3. Problème de clonage d'une partition dynamique
    Par Claude Poulin dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 11/01/2008, 20h12
  4. Problème de généricité de type privé
    Par dr_octopus74 dans le forum Ada
    Réponses: 5
    Dernier message: 20/11/2007, 22h27
  5. problème de généricité avec Eclipse
    Par kespy13 dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 02/04/2007, 00h05

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