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 :

Cast de List<monObj> en MonObjs (de type List<monObj> impossible


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut Cast de List<monObj> en MonObjs (de type List<monObj> impossible
    Bonjour à tous,

    Le titre résume tout.

    J'ai une classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class tblUser() {}
    Une autre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class tblUsers : List<tblUser> { }
    Et j'ai une variable de type List<tblUser> que je ne peux caster en tblUsers... Un vrai castete ;-)

    Entre les ToList(), ToArray(), ToList<tblUser>() et (tblUsers)tmp.items;
    ...J'ai essayé pas mal de chose... Je suis à court d'idées.

    Ce serait aberrant de faire un foreach.

    Est ce que quelqu'un a une idée ?

    Merci d'avance.

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    tblUsers : List<tblUser>
    cette déclaration indique au compilateur que tblUsers est un List<tblUser>
    donc tu peux caster un tblUsers en List<tblUser>, tout ce qui existe sur List<tblUser> existera forcément sur tblUsers
    mais l'inverse n'est pas vrai, en effet si tu rajoutes des propriétés dans cette classe, un List<tblUSer> ne les auras pas, voilà pourquoi le cast dans ce sens est impossible

    car contre tu peux faire une surcharge du constructeur pour demander un List<tblUSer> en paramètre
    (ou d'autres solutions selon ton code ...)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Bonjour Pol, 63ème du nom, ;-)

    Merci pour la réponse très claire.
    Ok pour le constructeur avec le paramètre, mais du coup, je dois malgré tout faire un foreach ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            public tblUsers(List<tblUser> pTblUsers) {
                foreach (var item in pTblUsers)
                    this.Add(item);
            }

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    oui et non

    ca dépend du code de ta classe
    tu as surchargé des membres ? tu as une variable List ? tu n'as aucun code dans ta classe (auquel cas quelle utilité ?) ?

    si tu as une variable tu la remplaces par celle qu'on te passes
    sinon tu peux faire .addrange avec .toarray (qui avec un peu de malchance fait un for each), mais bon rien de grave dans ce cas aussi
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Non, je n'ai pas de variable interne.

    En fait, mon là ou je veux faire mon cast, je suis déjà dans la classe tblUsers.
    C'est une méthode getAll() qui récupère un flux Json qui correspond à des users.
    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
     
        [DataContract]
        public class GridUsers {
     
            /// <summary>Constructeur</summary>
            public GridUsers() { }
     
            [DataMember]
            public string total { get; set; }
            [DataMember]
            public string offset { get; set; }
            [DataMember]
            public string page { get; set; }
            [DataMember]
            public List<tblUser> items { get; set; }
     
        }
     
        public class tblUsers : List<tblUser> {
            public static tblUsers getAll() {
                var ret = new tblUsers();
                var retApi = clsApiRest.GetJson(url.ToString());
                if ((retApi.Item1) && (!string.IsNullOrEmpty(retApi.Item2))) {
                    var tmp = new JavaScriptSerializer().Deserialize<GridUsers>(retApi.Item2);
                    foreach (var item in tmp.items) {
                        ret.Add(item);
                    }
                } else {
                    msgErr = retApi.Item2;
                    return null;
                }
                return ret;
            }
    }
    Mais peut être que je ne fait pas ça comme il faut ?

    En tout cas, bonne idée le AddrRange, c'est plus propre (même s'il faut un foreach derrière...

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    moi ce que je fais en général c'est une classe de données (type ton tblUser)
    dans cette classe je mets un static void de chargement (ton json)
    une variable static privée de type list<type>
    une accesseur du genre public static readonly property qui retourne le list<type>
    et donc la méthode de chargement ne fait que setter la variable qui est bien de type list<type>

    il est utilie de dériver le list si on a quelque chose à modifier/rajouter sur le fonctionnement même de la collection (des .add différents par exemple)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Bon, j'ai réagencé ça.
    Il est vrai que pour le moment, ma classe tblUsers n'est pas indispensable.... C'est des résidus de mes habitudes avec les accès SQL.

    J'ai fait ça, pour info:
    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
     
        [DataContract]
        public class GridUsers { // ObservableCollection
     
            #region Constructeurs
            /// <summary>Constructeur</summary>
            public GridUsers() { }
            #endregion
     
            static string msgErr { get { return clsProvider.msgErr; } set { clsProvider.msgErr = value; } }
     
            [DataMember]
            public string total { get; set; }
            [DataMember]
            public string offset { get; set; }
            [DataMember]
            public string page { get; set; }
            [DataMember]
            public List<tblUser> items { get; set; }
     
            /// <summary>Retourne tous les éléments de la table</summary>
            /// <returns>Les éléments dans une liste.</returns>
            public static GridUsers getAll() {
                var retApi = clsApiRest.GetJson(url.ToString());
                if ((retApi.Item1) && (!string.IsNullOrEmpty(retApi.Item2))) {
                    var ret = new JavaScriptSerializer().Deserialize<GridUsers>(retApi.Item2);
                    return ret;
                } else {
                    msgErr = retApi.Item2;
                    return null;
                }
            }
        }

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/05/2006, 15h12
  2. Heriter le type list de la STL
    Par mathher dans le forum SL & STL
    Réponses: 13
    Dernier message: 28/03/2006, 23h48
  3. array de type "liste"
    Par antrax2013 dans le forum ASP
    Réponses: 6
    Dernier message: 15/02/2006, 02h18
  4. Réponses: 7
    Dernier message: 14/02/2005, 10h40
  5. Pb avec le formulaire en type List
    Par LoulouFifi dans le forum Struts 1
    Réponses: 5
    Dernier message: 04/02/2004, 11h34

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