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 :

retour du type générique avec réflexion


Sujet :

C#

  1. #1
    Membre actif Avatar de maxeur
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    416
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 416
    Points : 267
    Points
    267
    Par défaut retour du type générique avec réflexion
    Bonjour à tous,

    je suis confronté à un problème qui m'est impossible à résoudre

    J'ai une classe générique et d'autres classe qui héritent de cette classe générique.

    Je ne connais pas par avance quel va être le type de la classe qui va être instanciée.

    J'utilise donc la réflexion pour instancier mes classes.

    Jusqu'ici tout va bien.

    Par contre ensuite je suis en train de me casser les dents sur l'appel d'une méthode générique qui possède comme type de retour un objet du type de la classe instanciée.

    Voici le code de cette méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static T Load<T>(string nomFichier) where T : new()
            {
                // Chargement des coefficients pour le calcul des BP
                ObjectXMLSerializer objectXMLSerializer = new ObjectXMLSerializer();
     
                T item = new T();
     
                item = (T)objectXMLSerializer.Load(item, nomFichier, SerializedFormatType.Document);
     
                return item;
            }
    Cette fonction fonctionne trés bien sans utiliser la réflexion

    Voici maintenant le code de mon appel avec la réflexion

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    private object chargerMethodeLoad( string assembly, string parametre)
            {
                object[] parameters = new object[1];
                object a1 = null;
     
                Assembly monAssembly = Assembly.Load(assembly);
                ResourceManager resource = new ResourceManager("Migration_Bradley.Fichiers.correspondance", GetType().Assembly);
     
                try
                {
                    foreach (Type type in monAssembly.GetTypes())
                    {
                        if (type.Name == resource.GetString(assembly))
                        {
                            a1 = Activator.CreateInstance(type);
                            MethodInfo method =typeof(XmlGenerique<automate>).GetMethod("Load");
                            MethodInfo genericMethod = method.MakeGenericMethod(type);
                            parameters[0] = parametre;
                            genericMethod.Invoke(a1, parameters);
                        }
                    }   
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
     
                return a1;
            }
    Les types ayant la possibilité sont les types FEFExchangeFile et RsLogix5000Content le type automate et le type dont ces classe hérites et la classe automate hérite elle même de la classe XmlGenerique qui définit la méthode Load

    Mon programme s'éxécute sans erreur, le seul soucis et que mon objet ne possède pas les valeurs qui dévraient lui être associée (a1).

    J'ai utilisé le debuger la fonction récupère les valeurs mais au moment ou a1 devrait récupérer les valeurs ils ne les récupère pas

    Est ce que vous pouvez me dire d'où vient l'erreur et si ce que je souhaite faire est possible ou bien s'il existe une méthode de contournement

    Merci d'avance pour vos réponses

  2. #2
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    genericMethod.Invoke(a1, parameters);
    Il faut peut être que tu assigne la valeur retourné par cette méthode à la variable a1 ?

  3. #3
    Membre actif Avatar de maxeur
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    416
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 416
    Points : 267
    Points
    267
    Par défaut
    Franchement merci bien,

    cela fait deux jour que je suis dessus et je suis vraiment un gros boulet pour ne pas voir ça

    j'étais persuadé que cela venait du type et vu que j'avais récupérer le code sur le site j'étais persuadé que c'était bon

    Encore une fois merci

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/06/2009, 12h30
  2. réflexion sur des types génériques
    Par ziad.shady dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2008, 12h25
  3. type générique avec héritage multiple
    Par apqmwnqmap dans le forum Langage
    Réponses: 4
    Dernier message: 13/03/2008, 14h56
  4. Webservice avec AXIS , Eclipse et retour de type complexe
    Par Ashen-Shugar dans le forum Services Web
    Réponses: 2
    Dernier message: 26/12/2007, 21h24
  5. [2.0] polymorphisme avec des types générique
    Par mister3957 dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 31/05/2007, 08h11

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