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

Windows Communication Foundation .NET Discussion :

Méthode avec un paramètre de type "object" : comment lui passer une List ?


Sujet :

Windows Communication Foundation .NET

  1. #1
    Nouveau membre du Club Avatar de Picsonald
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Points : 39
    Points
    39
    Par défaut Méthode avec un paramètre de type "object" : comment lui passer une List ?
    Bonjour à tous,

    Je suis actuellement en train de coder un service WCF dont une des méthodes doit pouvoir récupérer en paramètre un String, un Int32 ou une List<String>.

    Concrètement, le code serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [ServiceContract]
    class MonService
    {
        [OperationContract]
        void PasserObjet(Object monObjet)
        {
            // Je peux recevoir un String, un Int32 ou une List<String>.
            MessageBox.Show("Objet de type " + monObjet.GetType().FullName);
        }
    }

    Voici ce qu'il se passe lorsque le programme client sollicite la méthode "PasserObjet" de mon service WCF :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void btn1_Click(object sender, EventArgs e)
    {
        proxy.PasserObjet("Chaine de caractère");
    }
    Dans le cas présent, mon serveur me dit "Objet de type System.String". Je peux alors faire un cast et utiliser mon paramètre. Tout va bien.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void btn2_Click(object sender, EventArgs e)
    {
        List<String> _lstStr = new List<String>();
        _lstStr.Add("Liste de");
        _lstStr.Add("chaine de");
        _lstStr.Add("caractère.");
        proxy.PasserObjet(_lstStr);
    }
    Dans ce cas par contre, le programme client plante et me renvoie une exception qui ressemble à cela :
    Une erreur s'est produite en tentant de sérialiser le paramètre. Le type 'System.Collections.Generic.List`1[System.String]' avec le nom de contrat de données 'ArrayOfstring' n'est pas attendu. Utilisez un DataContractResolver ou ajoutez tous les types non connus statiquement à la liste des types connus, par exemple en utilisant l'attribut KnownTypeAttribute.
    Le serveur ne se sent pas sollicité et reste stable.


    Avez-vous une idée pour résoudre ce problème ? J'ai fait pas mal de recherches sur Internet, et je ne vois pas de solution...

    Merci d'avance !

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

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Bonjour

    Il faut utiliser l'attribut KnownType pour chaque type à passer, sinon WCF ne peux pas déterminer à quels types il est susceptible d'avoir affaire.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  3. #3
    Nouveau membre du Club Avatar de Picsonald
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Points : 39
    Points
    39
    Par défaut
    Merci pour ta réponse Bluedeep.

    Je viens d'essayer. "KnowType", en soit, n'est pas reconnu. Donc j'ai utilisé "ServiceKnownType" de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [OperationContract, ServiceKnownType(typeof(List<String>))]
    void PasserObjet(Object objet)
    {
        MessageBox.Show("Objet de type " + objet.GetType().FullName);
    }
    Ça n'a pas fonctionné. Du coup j'ai essayer de déposer l'attribut au niveau de la classe carrément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [ServiceContract]
    [ServiceKnownType(typeof(List<String>))]
    class SupervisionService
    {
        // ...
    }
    L'erreur reste la même. Y a-t-il quelque chose que je fais mal ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Peut-on savoir ce qui t'empêche d'avoir autant d'opérations qu'il y a de types à utiliser ? Parce que là dans ce que tu fais ça ne sent pas du tout la bonne pratique.

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

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Bonjour

    Bizarre; j'ai toujours utilisé cela sur la classe qui contient le DataContract (mais jamais sur le ServiceContract au demeurant).

    Si tu utilises le ServiceKnownType, donc sur le ServiceContract, tu dois aussi préciser le nom de la méthode concernée. (en général, on définit cela au niveau de l'interface, pas de l'implémentation du service).


    Mais il est vrai que cela a toujours été sur des retours et pas sur des arguments (dans ce cas, il est plus simple de mettre une méthode surchargée pour chaque type).

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  6. #6
    Nouveau membre du Club Avatar de Picsonald
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Points : 39
    Points
    39
    Par défaut
    @ h2s84 : Oh... oui :-). Mais c'est loin d'être évident.

    Mon service WCF est utilisé par des programmes clients qui s’exécutent sur quelques unes de mes machines distantes. Le serveur a pour but de me montrer en un coup d’œil l'état de mes clients (supervision).

    Les clients peuvent m'envoyer un Int32 qui contiendra le taux de remplissage du disque dur, ou de la mémoire vive.
    Il peuvent m'envoyer un String qui contiendra la version d'un driver, la version de Windows Update.
    Il peuvent m'envoyer une List<String> qui contiendra la liste des process en cours d'exécution ou la liste des utilisateurs connectés.


    Pourquoi ne pas faire des méthodes dédiées ? Pour des motifs de rétrocompatibilité et d'évolutivité.

    Admettons qu'un jour, je souhaite également surveiller la version de mes anitivirus, l'état du trafic réseau, la liste des services anormalement arrêtés... Je vais devoir changer le code source de mon client, mais celui du serveur : non. Le serveur connait les critères de surveillance grâce à des infos situées en base de données, et il est capable de les retranscrire à l'aide d'un code dynamique.

    A terme, toute version de mon serveur pourra fonctionner avec toute version de mon client, sans risque, du coté de mon client, un plantage pour "Méthode distante inexistante".


    Tu penses que je fais fausse route avec mon paramètre "Object" ?




    Bluedeep, Ok je vais essayer de regarder ça. Les surcharges, perso, moi, ça ne veut pas marcher (mais j'ai pas beaucoup creusé dans ce sens).

  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 : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Picsonald Voir le message
    Admettons qu'un jour, je souhaite également surveiller la version de mes anitivirus, l'état du trafic réseau, la liste des services anormalement arrêtés... Je vais devoir changer le code source de mon client, mais celui du serveur : non. .
    Mais si, tu devras changer le code du serveur, puisque une ligne KnownType devra de toute manière être ajoutée en plus.

    C'est la raison pour laquelle on utilise normalement le KnownType que pour les retours et les propriétés : pour les arguments, la surcharge de méthode remplit bien mieux la tâche.

    A vrai dire, peut on utiliser le KnownType pour les arguments ? à la réflexion, je n'en sais rien puisque cela ne correspond à aucun besoin de design normal.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  8. #8
    Invité
    Invité(e)
    Par défaut
    Ok je vois. Mais là j'aimerai savoir comment à partir du passage d'un Int32 ton code côté serveur pourra différencier qu'il s'agit de la quantité de la mémoire RAM ou que c'est celle de la taille du disque dur.

    Sinon au lieu de lui passer une collection de string List<string> essaies de lui passer un tableau de string string[] et voir ce que ça donne.

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Euh Je trouve illogique de passer un Objet

    Crées 3 méthodes différentes

    perso je passe des list<string>, des list<int>, des list<MesClasses> sans problème

    les string[] seront convertis en list<string>
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  10. #10
    Nouveau membre du Club Avatar de Picsonald
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Points : 39
    Points
    39
    Par défaut
    Merci pour vos réponses.

    Citation Envoyé par Bluedeep Voir le message
    Mais si, tu devras changer le code du serveur, puisque une ligne KnownType devra de toute manière être ajoutée en plus.
    Tu marques un point... À condition bien sûr que le problème soit lié à cela (car moi, avant que tu ne m'en parles, j'étais persuadé que le problème ne venait pas de là).


    Citation Envoyé par Bluedeep Voir le message
    cela ne correspond à aucun besoin de design normal.
    Là tu m'intéresses car je veux essayer de faire du code propre. Mais j'ai dû partir sur une mauvaise piste avec cet "object"... Je me suis un peu inspiré, en fait, du fameux "object sender" que l'on retrouve dans les événements liés à un contrôle en WinForm, et qui correspond au contrôle auteur de l’événement. Je me suis dit : dans mon cas, c'est pareil. je ne sais pas exactement le type que je vais avoir en paramètre de cette méthode.


    Citation Envoyé par h2s84 Voir le message
    Mais là j'aimerai savoir comment à partir du passage d'un Int32 ton code côté serveur pourra différencier qu'il s'agit de la quantité de la mémoire RAM ou que c'est celle de la taille du disque dur.
    En fait, j'ai voulu réduire les extraits de code au plus simple pour que le problème soit bien apparent. Je ne voulait pas vous ennuyer avec les contraintes diverses et variées pour laquelle j'ai déjà trouvé une solution. Toutefois, pour répondre à ta question : ma méthode "PasserObjet" s'appelle "SetValeur". Voici les paramètres qu'elle prend :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [OperationContract]
    public void SetValeur(Object valeur, String hostName, Int32 type)
    {
        // ...
    }
    Un exemple d'appel a cette méthode par le client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetValeur(85, "SQLSERV01", 5);
    Ici le type "5" indique au serveur que la valeur "85" concerne le pourcentage d'utilisation processeur moyen sur la machine SQLSERV01.


    Citation Envoyé par BenoitM Voir le message
    Crées 3 méthodes différentes
    Oui. En attendant de trouver une solution au problème qui se pose, j'ai créé trois méthodes différentes (au nom différent, puisque je n'arrive pas à faire de surcharges). Mais je ne saurais trop dire pourquoi : ça me chagrine.



    Vous n'avez pas un idée qui me permettrais d'avoir un paramètre "objet" dans lequel je pourrais passer String, Int32 et List<String> ?

  11. #11
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    +1 pour la surcharge.

    +1 aussi pour reconnaître la différence entre la taille de la RAM et la taille du disque dur

    Aussi, pourquoi ne pas envoyer un message complexe : une structure sérialisée en XML ?

    Côté serveur, tu pourras utiliser différentes méthodes pour désérialiser selon la version du message reçu.
    On ne jouit bien que de ce qu’on partage.

  12. #12
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Ah ben c'est plus clair comme ça.

    Essaie le string[]

    Et si ça marche pas, tu peux toujours faire un string.join() avant de l'envoyer au serveur.

    PS : Et en terme de code propre, perso je préférerais limiter les accès client/server, en envoyant toutes les propriétés d'un coup (soit un gros string en paramètre qui contient un array de tes messages sérialiés, soit directement un array de struct correspondant à tes messages)
    On ne jouit bien que de ce qu’on partage.

  13. #13
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Citation Envoyé par Picsonald Voir le message
    En attendant de trouver une solution au problème qui se pose, j'ai créé trois méthodes différentes (au nom différent, puisque je n'arrive pas à faire de surcharges). Mais je ne saurais trop dire pourquoi : ça me chagrine.
    Parce que les WebService ne supporte pas le polymorphisme
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  14. #14
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Tu peux peut-être essayer de cree une classe message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class message
    {
    public property Object Value;
    public property string hostname;
    }
    et que ton service aie une methode
    public
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void PasserMessages( List<Message> messages)
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  15. #15
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    tu peux toujours faire un string.join() avant de l'envoyer au serveur.
    +1,
    Tu devrais essayer la méthode de StringBuilder je pense que ça résout ton problème si tu choisis bien le caractère de séparation pour les différentes parties (paramètres envoyés) et aussi pour les listes bien que cela ne soit pas du tout une bonne pratique.

    Citation Envoyé par BenoitM Voir le message
    Parce que les WebService ne supporte pas le polymorphisme
    C'est le polymorphisme paramétré (surcharge de méthodes) qui n'est pas pris en compte. Mais le polymorphisme par sous-typage (héritage) est pris en compte (on peut le simuler avec l'attribut KnownType).

  16. #16
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Je viens d'installer VWD Express pour tester (mon premier web service WCF, snif)

    Et ça donne :

    Service1.svc.cs
    Code c# : 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
    30
    31
    32
    33
    34
    35
     
    using System;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.Text;
     
    namespace WCFTestParams
    {
        // REMARQUE*: vous pouvez utiliser la commande Renommer du menu Refactoriser pour changer le nom de classe "Service1" dans le code, le fichier svc et le fichier de configuration.
        public class Service1 : IService1
        {
            public int TestParameters(Message[] messages)
            {
                int res = 0;
                foreach (Message message in messages)
                {
                    switch (message.type)
                    {
                        case 1:
                            res += (int)message.value;
                            break;
                        case 2:
                            res += ((string)message.value).Length;
                            break;
                        case 3:
                            res += ((string)message.value).Split('|').Length;
                            break;
                    }
                }
                return res;
            }
        }
    }

    IService1.cs
    Code c# : 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
    30
    31
    32
    33
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.Text;
     
    namespace WCFTestParams
    {
        // REMARQUE*: vous pouvez utiliser la commande Renommer du menu Refactoriser pour changer le nom d'interface "IService1" à la fois dans le code et le fichier de configuration.
        [ServiceContract]
        public interface IService1
        {
            [OperationContract]
            int TestParameters(Message[] messages);
            // TODO: ajoutez vos opérations de service ici
        }
     
     
        // Utilisez un contrat de données comme indiqué dans l'exemple ci-après pour ajouter les types composites aux opérations de service.
        [DataContract]
        public class Message
        {
            [DataMember]
            public int type { get; set; }
            [DataMember]
            public object value { get; set; }
            [DataMember]
            public string host { get; set; }
        }
    }

    Et enfin un client console :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    using System;
    using System.Collections.Generic;
    using System.Text;
    using TestService.ServiceReference1;
     
    namespace TestService
    {
        public static class Extensions
        {
            public static string Join(this string[] s, char c)
            {
                StringBuilder sb = new StringBuilder();
     
                int i, nb;
                for (i = 0, nb = s.Length - 1; i < nb; i++)
                {
                    sb.AppendFormat("{0}{1}", s[i], c);
                }
                return sb.Append(s[i]).ToString();
            }
        }
     
        class Program
        {
            static void Main(string[] args)
            {
                Message[] messages = new Message[3];
                Message message1 = new Message();
                message1.host = "toto";
                message1.type = 1;
                message1.value = 10;
                messages[0] = message1;
     
                Message message2 = new Message();
                message2.host = "toto";
                message2.type = 2;
                message2.value = "test";
                messages[1] = message2;
     
                Message message3 = new Message();
                message3.host = "toto";
                message3.type = 3;
                message3.value = (new string[2] { "toto", "titi" }).Join('|');
                messages[2] = message3;
     
                Service1Client sc = new Service1Client();
     
                // Le retour devrait être 10 + 4 + 2 = 16
                Console.WriteLine(sc.TestParameters(messages));
                Console.ReadKey(true);
            }
        }
    }
    J'obtiens bien 16 en réponse, donc ça me semble tout à fait bien fonctionner.
    On ne jouit bien que de ce qu’on partage.

  17. #17
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Sâchant qu'à la limite, puisque c'est tout sérialisé en XML au final, pourquoi ne pas prendre un paramètre string et non object puis faire int.tryparse() quand tu attends un int ?

    Perso, les object, moins j'en vois, mieux je me porte
    On ne jouit bien que de ce qu’on partage.

  18. #18
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    C'est le polymorphisme paramétré (surcharge de méthodes) qui n'est pas pris en compte. Mais le polymorphisme par sous-typage (héritage) est pris en compte (on peut le simuler avec l'attribut KnownType).
    Ah j'avais jamais entendu parler des deux types

    Ben pour moi le polymorphisme par sous-typage n'en n'etait pas un

    Citation Envoyé par StringBuilder Voir le message
    ...
    awww courageux
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  19. #19
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Autant je suis d'accord avec le fait qu'accepter un object ca soit pas jojo, autant il y'a des solutions assez élégantes possibles
    Le premier point serait quand même de faire un type de base (pour pas accepter n'importe quel objet).
    Ensuite, il faut effectivement que tu passes parle ServiceKnownType mais que tu utilises un autre constructeur de l'attribut:

    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
     
    [ServiceKnownType("GetKnownTypes", typeof(KnownTypesHelper))]
    [ServiceContract()]
    public interface IService
    {
        [OperationContract]
        void DoSomething(TypeBase obj);
    }
     
    public static class KnownTypesHelper
    {
    	public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)
    	{
    		var types = new List<Type> { typeof(TypeBase) };
    		types.AddRange(Assembly.GetExecutingAssembly().GetTypes().Where(t => t.IsSubclassOf(typeof(TypeBase))));
    		return types;
    	}
    }
     
    public class TypeBase {}
     
    public class TypeA : TypeBase {}
    public class TypeB : TypeBase {}
    Ce petit helper, te permets de découvrir à la volée les types qui peuvent transiter (sans déclarer tous les types de la terre, ni les déclarer explicitement).
    Si tu ne fais qu'ajouter des types dans ton assembly, il ne devrait pas y avoir de problèmes de compatibilités avec tes clients.

  20. #20
    Nouveau membre du Club Avatar de Picsonald
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Points : 39
    Points
    39
    Par défaut
    Woooow ^^ Quel engouement pour mon problème.

    Merci à tous pour vos apport. Je vais regarder tout ça, et je vous tiens au courant.

    C'est super sympa en tout cas :-) !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 11
    Dernier message: 18/05/2010, 17h31
  2. Réponses: 8
    Dernier message: 19/02/2010, 12h47
  3. appel d'une méthode avec plusieurs paramètres
    Par soujava dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 11/05/2008, 23h30

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