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 Presentation Foundation Discussion :

Creer une fonction generique


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de chris81
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 626
    Par défaut Creer une fonction generique
    Bonjour,

    j'ai cette fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      private T GetItemAtLocation(T location)
            {
                HitTestResult hitTestResults = VisualTreeHelper.HitTest(this.tvChamp, location);
     
                if (hitTestResults != null && hitTestResults.VisualHit is FrameworkElement)
                {
                    FrameworkElement frameworkElement = hitTestResults.VisualHit as FrameworkElement;
     
                    return frameworkElement.DataContext;
                }
     
                return null;
            }
    Cela ne compile pas, j'ai l'erreur :
    Le type ou le nom d'espace de noms 'T' est introuvable (une directive using ou une référence d'assembly est-elle manquante*?)

    Sauriez vous comment corriger cela ?

    merci et bonnes fêtes à tous

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    voila comment declarrer une fonction generique
    faut pas oublier le <T>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     private T FindParentOfType<T>(DependencyObject item) where T : DependencyObject
            {
                DependencyObject parent = VisualTreeHelper.GetParent(item);
                do
                {
                    parent = VisualTreeHelper.GetParent(parent) as DependencyObject;
                } while (!(parent is T));
                return parent as T;
            }

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Par défaut
    Bonjour,

    Il nous manque un peu d'information de contexte pour essayer de résoudre votre problème ; mais voyant que vous utilisez FrameworkElement qui existe dans l'espace de noms System.Windows ( http://msdn.microsoft.com/en-us/libr...rkelement.aspx ) j'en déduis qu'on peut faire l'hypothèse que vous êtes en version de framework 3.5, avec WPF, et que vous tentez de définir un type classe générique (puisque qu'il n'y a pas de contrainte générique introduite par where sur la signature de votre méthode), avec une version de C# >= 2, qui effectivement supporte lesdits génériques.

    Partant, la définition de votre classe ressemble-t-elle à ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class VotreClasse<T>
    {
      // ...
            private T GetItemAtLocation(T location)
            {
                // ...
                return null;
            }
      // ...
    }
    Notez comment le "jeton" qui introduit le type générique "T" doit dans ce cas apparaître dès la partie "en tête" ( "... class VotreClasse<T> ..." ) de votre définition de classe (cf. spécification C# 2.0 -- ISO/IEC 23270 )

    'HTH

    Bonnes fêtes à vous aussi.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    pour ton exemple lysiandad
    il me semble qu'il faudrait que le type T soit nullabe

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Par défaut
    Citation Envoyé par ikeas Voir le message
    pour ton exemple lysiandad
    il me semble qu'il faudrait que le type T soit nullabe
    Hmm.. vu l'usage qui en est fait par le code de chris posté ci dessus, il me semble surtout qu'il doive être en tout cas conforme (par un "where T : Point") au type Point, si c'est possible ; voir :

    http://msdn.microsoft.com/en-us/library/ms608752.aspx

  6. #6
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par lysiandad Voir le message
    Notez comment le "jeton" qui introduit le type générique "T" doit dans ce cas apparaître dès la partie "en tête" ( "... class VotreClasse<T> ..." ) de votre définition de classe (cf. spécification C# 2.0 -- ISO/IEC 23270)
    C'est bien de citer des sources, mais faut il encore la maitriser.
    La solution la plus plausible dans ce cas, c'est de rendre la méthode générique et non pas la classe. C'est inutile de rendre toute une classe générique pour une méthode.

    Citation Envoyé par ikeas Voir le message
    pour ton exemple lysiandad
    il me semble qu'il faudrait que le type T soit nullabe
    Effectivement, ou qu'il soit de type référence.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    [...]
    La solution la plus plausible dans ce cas, c'est de rendre la méthode générique et non pas la classe. C'est inutile de rendre toute une classe générique pour une méthode.
    Effectivement, ou qu'il soit de type référence.
    Ahem. Pour ce qui est de ma connaissance des méthodes génériques avec ou sans contrainte, via le type classe lui-même ou via la signature de la méthode, je n'ai pas trop de problème, merci :

    http://dotxml.brinkster.net/experime..._delegates.bmp



    En ce qui concerne le code de notre ami, je n'ai pas l'information selon laquelle le code client, qui appelle cette méthode, peut se permettre / s'embarrasser de faire l'instanciation de type conforme au type Point qui semble être requis par l'appel à HitTest dans le corps de cette méthode.

    Tel que le problème fut posé, rien ne m'a dit que tous les appels clients de GetItemAtLocation(...) proviennent d'un code qui "connait" cette conformité au type Point (par exemple si down cast vers "object" ou que sais-je...) ; j'ai donc fait, par défaut, l'hypothèse la plus faible, et proposé en conséquence.

    Notre ami tranchera sur ce qui lui convient le mieux de toute façon, maintenant qu'il en sait plus sur les possibilités offertes par la syntaxe C#.

    [ EDIT ] (à l'attention de chris)
    Cela dit, ce GetItemAtLocation est private ; donc a moins que le code de l'appelant, dans la meme classe je suppose, soit très "tordu" et malheureusement pas candidat au refactoring (peu probable), je suppose qu'il en effet préférable d'avoir dans son cas :

    T GetItemAtLocation<T>(...) where T : Point

  8. #8
    Membre éclairé Avatar de chris81
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 626
    Par défaut
    Re tt le monde et merci.

    Ben en fait ce fonction est dans du code behind d'une form. Donc au lieu de retourner un T je lui dit de me retourner mon objet, c'est plus simple.

    Désolé de ne répondre que maintenant mais j'été parti acheter une Wii Fit et dieu sait que c'est cho àtrouver, surtout le 24

Discussions similaires

  1. creer une class generique factory
    Par Battosaiii dans le forum Langage
    Réponses: 1
    Dernier message: 26/07/2007, 13h56
  2. Implementer une fonction generique
    Par Seth77 dans le forum C#
    Réponses: 7
    Dernier message: 26/02/2007, 11h11
  3. Réponses: 8
    Dernier message: 30/08/2006, 10h08
  4. creer une fonction avec arguments
    Par niglo dans le forum ASP
    Réponses: 3
    Dernier message: 03/06/2005, 08h04
  5. [langage] Creer une fonction qui met en majuscule ?
    Par Cyber@l dans le forum Langage
    Réponses: 6
    Dernier message: 04/12/2003, 18h44

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