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 d'objet generique [Débutant]


Sujet :

C#

  1. #1
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut Cast d'objet generique
    Bonjour,

    un petit cas pour un newbie dans mon genre.

    donc peut-être une bete question

    néanmoins

    j'ai plusieurs classes construites à peu pres comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //Item
    	public class Item : INotifyPropertyChanged, ICloneable, IDisposable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // Items
        public class Items<T> : List<T>, INotifyPropertyChanged, ICloneable, IXml
            where T : Item
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Formula
    	public class Formula : Item
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Formulas
        public class Formulas : Items<Formula>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Product
    	public class Product: Item
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Products
        public class Products: Items<Product>
    lorsque je fait ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int nombreElements = (dataSource as Items<Item>).Count;
    ben ça va pas

    alors, comment puis-je faire un cast de datasource sans devoir lui mettre par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int nombreElements = (dataSource as Items<Formula>).Count;
    qui lui fonctionne
    ce qui m'obligerai à faire autant de condition, qu'il y a de type.


    merci de votre aide

    et si je n'ai pas trop été clair, ben ... n'hésitez pas

  2. #2
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    Bonjour,

    Est ce que tu as essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dataSource.OfType<Item>().Count();
    Je ne sais pas si ça va changer grand chose mais sait-on jamais
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  3. #3
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    bonjour et merci de la réponse

    je n'ai pas encore essayé non.

    mais encore une fois, cela implique que je connaisse le type de "datasource" à cet endroit du code et justement... je ne le connais pas

  4. #4
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    Je voulais dire Item pardon
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  5. #5
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    alors
    dataSource de posede pas d'élément OfType

    ce que je ne comprends pas, c'est pourquoi je ne puis redefinir l'objet dataSource qui a pour type "formulas" par exemple
    en un type Items<Item>
    il me revoie tjs null
    il y a surement un truc que je n'ai pas compris mais quoi?????

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 97
    Par défaut
    Une remarque (qui peut être considérer HS, dans ce cas désolé),

    "Caster" un type générique revient à avoir une faille de conception. Soit il n'était pas nécessaire d'utiliser une classe paramétrique, soit l'angle d'approche pour résoudre le problème n'est pas le bon

  7. #7
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    Justement, il s'agit d'avoir le Count d'Item sans avoir à caster si j'ai bien compris. Pas de problème de ce conception à ce niveau la.

    Quel est le framework utilisé ?
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  8. #8
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    Pourquoi HS??

    Mais si tu pouvais développer un peu plus, cela m'aiderait beaucoup par contre


  9. #9
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    Justement, il s'agit d'avoir le Count d'Item sans avoir à caster si j'ai bien compris.
    c'est bien cela
    dans ma tête, cela devrait etre possible mais comment lol

    alors le framework, bonne question....
    .NET framework 3.5 SP1, c'est ça que tu demande?? (suis encore un peu nul donc faut m'excuser si je dis des énormité hein! )

  10. #10
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    Alors si tu développes en Framework 3.5, il faut que tu rajoutes une référence sur System.Core.dll et que tu fasses un using System.Linq (si je ne dis pas de bétise) afin de pouvoir utiliser OfType<>(); sur ta source de données.
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  11. #11
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 97
    Par défaut
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int nombreElements = (dataSource as Items<Formula>).Count;

    Je ne vois pas l’intérêt de spécifier Items<Formula> si c'est pour obtenir un int.

    Si on ne peut pas faire directement dataSource.Count, c'est qu'il y a un problème. Le but de la généricité, c'est tout de même de définir un comportement indépendant du type de la valeur.

    Si tu castes ta variable datasource c'est que l'interface ou la classe abstraite qu'elle représente ne respecte pas la loi de Liskov (le principe de Substitution dit de contravariance également). Ceci est donc un faille de conception car tu dois casser la structure de datasource (ton cast) pour utiliser le méthode Count. Tu perds donc le caractère générique

  12. #12
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    oui mais je suis obligé de définir dataSource comme objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private object dataSource;
     
            public object DataSource
            {
                set { dataSource = value; }
            }
    car il n'accepte que ça dans la définition d'un délégué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     public delegate void SourcevalidationEventHandler(object sender, SourceValidationEventArgs e);
    où sender est dataSource ...

    mais je ne sais pas si je me fait bien compris du coup

  13. #13
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 97
    Par défaut
    Pas du tout car ta datasource sera seulement "boxée" dans un object, tu peux très bien déclarer ta datasource en Item<Formula>

  14. #14
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    mais à ce moment là du code, je ne sais toujours pas à quel type j'ai affaire
    il est variable
    tout ce que je sias c'est que se sera Items<T>

  15. #15
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Si tu ne veux que le nombre d'éléments, tu peux caster ton object en ICollection (pas ICollection<Y>, mais System.Collections.ICollection, celui qui n'est pas générique et qui date de .Net 1)

    Après évidemment si ta méthode doit se comporter différemment selon le type contenu dans la collection, c'est souvent signe qu'il y a un problème de conception.

  16. #16
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    non, c'est juste pour compter le nombre d'élément
    en vue de faire une barre de progression à la sauvegarde

    je regarde ça

  17. #17
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    ce n'est pas vraiment ce que j'attendais
    (mon post demande surtout si c'est possible de faire ce que je demande et sinon pourquoi)
    donc pour ne puis-je pas par exemple
    passer une classe Formulas vers une classe Items<Item>
    c'est pas encore clair pour moi!

    mais sinon ça fonctionne nickel chrome!!

    donc grand merci pour ça déjà

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

Discussions similaires

  1. Problème de cast d'objet à la deuxième fois
    Par vilveq dans le forum Flex
    Réponses: 4
    Dernier message: 06/10/2009, 14h30
  2. [POO] Cast d'objet vers une classe
    Par karl3i dans le forum Langage
    Réponses: 9
    Dernier message: 27/07/2009, 10h12
  3. Cast IEnumerable objet typé
    Par UoLad dans le forum Linq
    Réponses: 2
    Dernier message: 09/05/2009, 14h26
  4. Instance of et Cast d'objet
    Par tiamat dans le forum Langage
    Réponses: 7
    Dernier message: 28/12/2007, 12h31
  5. cast d'objet parent en classe fille
    Par Plio dans le forum C++
    Réponses: 2
    Dernier message: 05/10/2007, 13h58

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