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 :

Fonction retourne T


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 44
    Points
    44
    Par défaut Fonction retourne T
    Bonjour,

    Je voudrais cree une fonction ou je peux lui faire retourner se que je veux.
    List<string>, List<string []>, string .....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     this.stock1.query_oracle<List<string>>(query_req, "update");
     
     
    public T query_oracle<T>(string query, string type) where T :  new()
    {
     
    ....
    T data = new T();
    data.Clear();
    ...
    return data;
    }
    Se code ne marche pas, j'ai l'erreur suivante:
    'T' does not contain a definition for 'Clear'
    Ce qui est normal mais je voudrais savoir comment resoudre se probleme.

    Merci

  2. #2
    Membre expérimenté Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Points : 1 699
    Points
    1 699
    Par défaut
    Citation Envoyé par Marsiou Voir le message
    Se code ne marche pas, j'ai l'erreur suivante:
    'T' does not contain a definition for 'Clear'
    Ce qui est normal mais je voudrais savoir comment resoudre se probleme.
    Merci
    Dans ce cas, il va falloir définir dans ta classe T, une méthode nommée
    Clear()
    dans laquelle tu mets les instructions que tu désires exécuter lors de l'appel de cette méthode.

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Tu dois rajouter une autre contrainte à ta méthode, comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public T query_oracle<T>(string query, string type) where T : new(), ICollection

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 44
    Points
    44
    Par défaut
    Quand tu utilise contol , tu a acces a toute les methodes du windows form je voudrais savoir s'il ya pas une class ou il ya toutes les methodes des Type de variable

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Tu pourrais être plus clair ? je comprends pas ce que tu veux exactement.
    Si tu veux faire "Clear", il faut que tu le fasses sur un objet pour lequel cette méthode est définie. Tous les objets héritent de "object", mais object n'a pas de méthode Clear, c'est pour ça que ton code marche pas. Comme tu as fait une fonction générique, tu peux spécifier des contraintes d'héritage sur le type T en faisant where T : UneClasse), et tu auras alors accès dans le corps de ta fonction aux méthodes de UneClasse.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 44
    Points
    44
    Par défaut
    Ok, En faite T peux prendre soit une List<string>, string,...

    Je voudrais savoir si il y a une classe qui les englobes tous.
    where T : UneClass)

    Et apres je peux directement :

    ou T est une List<string>
    T data = new T();
    data.Clear();

  7. #7
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Citation Envoyé par Marsiou
    T peux prendre soit une List<string>, string,...
    Ça risque d'être difficile. Pour commencer string ne propose pas de méthode clear()

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 44
    Points
    44
    Par défaut
    Je sais ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    If (T is string)
    ...
    Apres je peux faire des conditions en fonctions des differents type de declaration.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 44
    Points
    44
    Par défaut
    ok je sais pas si j'ai ete assez claire...

    Je veux cree une fonction qui peux me renvoyer n'importe qu'elle type(string, List<string>, int , bool ).

    Dans ma fonction je remplirai les variables en fonction du type et d'autre parametre.

    Par exemple , si j'ai passe une List a T , je veux pouvoir utiliser les methodes de List en passant par T.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    T bonjour = new T();
    If (T is List<string> )
    bonjour.add("toto");
    If(T is string)
    bonjour = "toto";
    Est ce que c'est possible?

  10. #10
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Oui c'est possible ? tu viens d'en faire la démonstration. A toi de gérer les multiples cas...

    Maintenant est-ce que tu bloques sur quelques chose en particulier ? éventuellement donne nous des billes supplémentaires : que va faire cette fonction, quels paramètres prend elle... enfin tout ce qui te semble utile pour qu'on puisse t'aider.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 44
    Points
    44
    Par défaut
    en faite cela ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    public T query_oracle<T>(string query, string type) where T : new()
    {
    T bonjour = new T();
    If (T is List<string> )
    bonjour.add("toto");
    If(T is string)
    bonjour = "toto";
    return bonjour;
    }
    Le compilateur ne reconnait pas la methode add
    'T' does not contain a definition for 'add'

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 44
    Points
    44
    Par défaut
    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
    55
    56
    57
    58
    59
    60
    61
    62
     
     public T query_oracle<T>(string query, string type) where T :  new()
            {
                string connection = "******";
                OracleConnection conn = new OracleConnection(connection);
     
                try
                {
                    conn.Open();
                    OracleCommand cmd = new OracleCommand();
                    cmd.Connection = conn;
                    cmd.CommandText = query;
     
     
                    T data = new T();
                    //if(T is List<string>)
                    //List<string> data = new List<string>();
                    data.Clear();
     
                    switch (type)
                    {
                        case "select_list":
     
                            cmd.CommandType = CommandType.Text;
                            OracleDataReader datareader = cmd.ExecuteReader();
     
                            while (datareader.Read())
                                for (int i = 0; i < datareader.FieldCount; ++i)
                                    data.Add(datareader.GetValue(i).ToString());
     
                            return data;
     
                        case "select_single":
                            if (cmd.ExecuteNonQuery() == -1)
                            {
                                OracleDataReader datareader2 = cmd.ExecuteReader();
                                datareader2.Read();
                                if (datareader2.HasRows == true)
                                    data.Add(datareader2.GetValue(0).ToString());
                                else
                                    data = null;
                            }
                            return data;
     
                        default:
                            cmd.ExecuteNonQuery();
                            break;
     
                    }
                    conn.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message.ToString());
                }
                finally
                {
                    conn.Dispose();
                }
                return null;
     
            }
    exemple d'appel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    string query_select_card = "SELECT a.ID_E FROM SMARTCARD  a WHERE a.ID_E='" + stock1.ID_E + "'"; ;
                    string query_card;
     
                    if (this.stock1.query_oracle(query_select_card, "select_single") == null)
                        query_card = "INSERT INTO SMARTCARD (card_number, case_number, status, id_e, logon) VALUES ('" + txt_id_card.Text + "', '" + txt_case.Text + "', '" + comb_state_card.SelectedItem + "', '" + stock1.ID_E + "','" + txt_logon.Text + "' ) ";
                    else
                        query_card = "UPDATE SMARTCARD SET CARD_NUMBER ='" + txt_id_card.Text + "', CASE_NUMBER ='" + txt_case.Text + "', STATUS ='" + comb_state_card.SelectedItem + "', logon='" + txt_logon.Text + "' WHERE (ID_E ='" + stock1.ID_E + "') ";
     
                    this.stock1.query_oracle(query_card, "update");
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    string query = "SELECT STATE.M_F_NAME, STATE.M_L_NAME, EMPLOYEE.F_NAME, EMPLOYEE.L_NAME, EMPLOYEE.SITE,  EMPLOYEE.DEPT, STATE.STATE" +
                                     " FROM STATE INNER JOIN EMPLOYEE ON STATE.ID_E = EMPLOYEE.ID_E " +
                                     " WHERE(STATE.ID_R = " + ID_R + ") AND (EMPLOYEE.ID_E = " + ID_E + ")";
                string query2 = "SELECT a.case_number, a.logon, a.card_number, a.status FROM smartcard a WHERE a.ID_E = " + ID_E;
     
              //  List<string> val = stock1.query_oracle<List<string>>(query, "select_list");
               // List<string> val2 = stock1.query_oracle<List<string>>(query2, "select_list");
                List<string> val = stock1.query_oracle(query, "select_list");
                List<string> val2 = stock1.query_oracle(query2, "select_list");
    Cette fonction n'est pas fini.

  13. #13
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par Marsiou Voir le message
    en faite cela ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    public T query_oracle<T>(string query, string type) where T : new()
    {
    T bonjour = new T();
    If (T is List<string> )
    bonjour.add("toto");
    If(T is string)
    bonjour = "toto";
    return bonjour;
    }
    Le compilateur ne reconnait pas la methode add
    'T' does not contain a definition for 'add'
    Alors moi j'aimerais connaitre l'interet, parce que c'est pourri comme solution et surtout c'est pas possible (à la limite avec de la reflection ça doit l'être mais là ça devient un poil compliqué [qq'un peut confirmer svp]).
    Les generic sont résolus au runtime de toute façon, pas à la compilation alors comment veux-tu que le compilo sache que il y aura une méthode Clear dans ton type T ?

    Les contraintes ça peut servir à ça, mais ça sert pas à faire ce que tu veux faire.

    A ce moment là tu fais 2 méthodes différentes une pour string, une autre pour List<string>, sinon je vois pas à part repenser ce que tu veux faire

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 44
    Points
    44
    Par défaut
    Alors moi j'aimerais connaitre l'interet, parce que c'est pourri comme solution et surtout c'est pas possible (à la limite avec de la reflection ça doit l'être mais là ça devient un poil compliqué [qq'un peut confirmer svp]).
    Ok, hum sympathique reponse....
    Si ta une meilleur idee j'ecoute tes propositions .

    Les contraintes ça peut servir à ça, mais ça sert pas à faire ce que tu veux faire.
    D'apres ta reponse il n'hesite pas de contraintes qui englobe tous ca.

    PS: c'est un peu le meme principe que des templates en c++

  15. #15
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par Marsiou Voir le message
    Ok, hum sympathique reponse....
    Si ta une meilleur idee j'ecoute tes propositions .
    Ben faudrait exactement savoir ce que tu veux faire en expliquant parce que j'ai pas vu l'interet avec ta fonction.
    public T query_oracle<T>(string query, string type) where T : new()

    Le truc avec les généric c'est que comme ça peut être tout et n'importe quoi le compilateur DOIT savoir si le type est susceptible d'avoir telle ou telle méthode (avec les contraintes).

    D'apres ta reponse il n'hesite pas de contraintes qui englobe tous ca.
    Euh non, comme contrainte tu peux spécifier que ton type doit hériter d'un certain type, doit implémenter une certaine interface, doit être un type valeur ou un type référence ou doit avoir un constructeur sans arguments, si tu trouves pas ton bonheur ici c'est que ça n'y est pas.

    PS: c'est un peu le meme principe que des templates en c++
    Possible mais tellement longtemps que j'ai pas fait de C++ que je sais plus comment on fait.

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 44
    Points
    44
    Par défaut
    Je fais des requetes SQL dans ma fonction, en fonction des parametres que je lui envoie je voudrais qu'elle me renvoie un string ou une List<string> ou une List<string[]>.

    Je n'ai pas envie de faire un copie coller de ma fonction juste pour changer le type que je renvoie et 2 pauvres parametres de remplissage.

    Le truc avec les généric c'est que comme ça peut être tout et n'importe quoi le compilateur DOIT savoir si le type est susceptible d'avoir telle ou telle méthode (avec les contraintes).
    Justement je cherche une constrainte....

    J'avoue que je suis pas tres claire dans mes explications.

  17. #17
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Bah pourquoi tu retournes pas un object ?

    Tu passes à ta fonction un enum (single, list ou le 3ème) et ensuite tu casts l'objet retourné en l'objet voulu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    object test(MonEnum type)
    {
       object obj;
     
       switch(type)
       {
          ...
          List<string> list = ...
          obj = list;
       }
       return obj;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    List<string> list = (List<string>)Test(MonEnum.List);
    Ok ou pas ?

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 44
    Points
    44
    Par défaut
    Je cherchais une constrainte vu qu'il n'y en pas je vais me rabattre sur object.

    Merci pour ton aide.

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

Discussions similaires

  1. Fonction retournant un pointeur
    Par Le Furet dans le forum C
    Réponses: 8
    Dernier message: 25/09/2005, 18h54
  2. Fonction retournant la partie entière d'un nombre
    Par annedjomo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/11/2004, 15h58
  3. fonction retournant une valeur
    Par ryan dans le forum ASP
    Réponses: 4
    Dernier message: 06/09/2004, 17h45
  4. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37
  5. [Manip de fichiers] Fonction retournant des infos
    Par sans_atouts dans le forum C
    Réponses: 3
    Dernier message: 24/07/2002, 14h16

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