Typage dynamique multiple [Résolu]

Messages postés
221
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012
- - Dernière réponse : l0r3nz1
Messages postés
221
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012
- 10 déc. 2010 à 16:25
Bonjour,

je fais une fonction qui peut prendre en argument un controle avec liste, genre comboBox ou ListTextBox.

pour l'instant je suis decu, j'ai deux constructeurs l'un avec un combobox en argument, l'autre un listBox, et le pire, je repete (presque) le code ce que je vais changer de suite.

je fais
***

public void construire_liste<T>(T controle_liste) where T:ListBox:ComboBox

***
mais la il y a une erreur.

deux solutions:
1-trouver une "interface commune" a ces deux controles genre T:Ilistable
2-faire comme un style de requete: where T:ListBox or T:ComboBox

que me conseillez vous?
Afficher la suite 

12 réponses

Meilleure réponse
Messages postés
155
Date d'inscription
jeudi 12 mai 2005
Statut
Membre
Dernière intervention
8 mars 2011
1
3
Merci
La contrainte sur le typage (qui n'est autre qu'une vérification supplémentaire à la compilation) doit donc être réalisée au niveau de la classe. De la sorte, tu seras certain que le type générique manipulé par ton tes objets sera ListControl.
Cette contrainte sera donc appliquée sur le constructeur mais aussi sur toutes les méthodes de la classe, ce qui semble tout à fait convenir à tes besoins.

Shao.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 190 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Shaolyne
Messages postés
155
Date d'inscription
jeudi 12 mai 2005
Statut
Membre
Dernière intervention
8 mars 2011
1
3
Merci
D'après ce que je comprend, tu aimerais avoir quelque chose comme ceci:
[Serializable] 
public class serializable_liste<T> where T:ListControl 
{
    //serializable_control contient un texte et un nom 
    //ma variable-propriété de classe: 
    public List<T> Items { get; set; }

    //Constructeur
    public serializable_liste(T listItemControl)
    {
        this.Add(listItemControl);
    }

    //Methode pour facilité l'ajout
    public void Add(T listItemControl)
    {
        Items.Add(listItemControl);
    }
}


Maintenant, je vois que tu veux accéder à chaque élément de ta collection. Y a t'il une raison? Que veux-tu faire avec cette liste ?

Shao.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 190 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Shaolyne
Messages postés
221
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012
0
Merci
public void ListeConstructor<T>(T listitemcontrol) where T : ListControl {

vu sur msdn

j aurais bien aimé faire se typage dans le construcreur
Commenter la réponse de l0r3nz1
Messages postés
155
Date d'inscription
jeudi 12 mai 2005
Statut
Membre
Dernière intervention
8 mars 2011
1
0
Merci
Salut,

Les contraintes sur les types génériques ne peuvent être appliqués qu'à 2 niveaux: Classe ou méthode/délégué.
Dans ton cas, il semble adéquat de placer la contrainte au niveau classe. Pourquoi vouloir appliquer la contrainte au niveau du constructeur?

Shao.
Commenter la réponse de Shaolyne
Messages postés
221
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012
0
Merci
Salut,

je veux faire un objet contenant les informations d'un control afin de pouvoir serializer cet objet, et donc sauvegarder les infos contenu dans le controle.

j avais penser a ca:
public void ListeConstructor<T>(T listItemControl) where T : ListControl
{
int i = 0;
Items = new string[listItemControl.Items.Count];
for (i = 0; i < listItemControl.Items.Count; i++)
{
Items[i] = listItemControl.Items[i].ToString();
}//next item
}//end of ListeConstructor

un fonction utilisable pour construire cet objet a partir de n'importe quel objet heritant de ListControl ( ListBox ou ComboBox et d'autres controles contenant une collection).

voila!
Commenter la réponse de l0r3nz1
Messages postés
221
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012
0
Merci
merci pour ton conseil,

mais je ne vois pas du tout comment appliquer cette contrainte a ma classe:

j ai ma classe
[Serializable]
class serializable_liste:serializable_control
//serializable_control contient un texte et un nom

ma variable-propriété de classe:
public string[] Items { get; set; }

un de mes constructeurs:

public serializable_liste(ComboBox listItemControl)
        {
            int i = 0;
            Items = new string[listItemControl.Items.Count];
            for (i = 0; i < listItemControl.Items.Count; i++)
            {
                Items[i] = listItemControl.Items[i].ToString();
            }//next item
        }//combo constructor end


idem pour les ListBox, deux fois la même Presque!!!.

pour la fonction ci dessus(post précédent), elle n'est pas utilisée car un ListControl n'a pas de .items et c est chiant.


NB: merci beaucoup pour les indices que tu m'as déjà apporté.
Commenter la réponse de l0r3nz1
Messages postés
221
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012
0
Merci
Salut,

je veux faire un truc un peu tordu en realité, mais après ca je maitriserais bien les dictionnaires, dictionnaire de delegate, et les typage dynamiques, absolument tous ce que je peux faire ... ou pas.

au final je veux recupérer les données d'un formulaire dans un objet pour pouvoir sauvegarder, transferer... ces données

j'ai un ensemble de classe: serializable_control qui est la classe de base, serializable_text: serializable_control , serializable_liste:serializable_control ( recupere un tableau de string en plus, un string un item ),serializable_checkListe:serializable_control (recupere un tableau de string en plus, un string un item coché)

et une classe serializable_form qui permet de creer un Dictionnaire de ces differents objet ( prochaine difficulté a surmonter ou a contourner)
un truc du genre mais avec un typage dynamique si possible:
  private Dictionary <String[],serializable_control> controlDataDictionnary = new Dictionary <String[],serializable_control>;


et je sais que c est possible, pouvoir serializer ce dictionaire, le string[] permettant de retenir les donnees de nom et type du formulaire car l etape apres c est la deserialization.

a la base j avais même pensé faire un dictionnaire de delagate pour pouvoir appeller une methode differente selon le type de controle "choppé" pour "serialization".

quand j'aurai fais le tour des typages dynamiques, dictionnaire de delegate, dictionnaire avec typage dynamique et je ne sais quel truc tortueux et que j'aurai déterminé ce qui est possible de faire ou pas je referai peut être ce travail de manière plus conventionnelle.

j'avais fait un truc du genre qui marchait tres bien il y longtemps, mais c'etait des modules VB developpé vite fait, et ca c est pas beau.

En tout cas merci beaucoup de m'aider. parce que en plus d'apprendre des trucs cela me motive a continuer a creuser plus.

merci ;)
Commenter la réponse de l0r3nz1
Messages postés
221
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012
0
Merci
rectification
[Serializable]
    class serializable_form<T> where T:serializable_control
    {
private Dictionary <String[],T> controlDataDictionnary = new Dictionary <String[],T>();


j ai deja retenu une lecon ;)
Commenter la réponse de l0r3nz1
Messages postés
221
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012
0
Merci
public class serializable_liste<T> where T:ListControl
ca marche nikel, mais pas de collection d items, ( pas de .items en tout cas) mais bon il n'y que les Combobox et ListBox qui héritent de cette classe. je ne vais pas chipoter a ce point et faire deux constructeurs. ... pour cette fois la.
Commenter la réponse de l0r3nz1
Messages postés
155
Date d'inscription
jeudi 12 mai 2005
Statut
Membre
Dernière intervention
8 mars 2011
1
0
Merci
Tu peux faire un casting :)
//Methode pour facilité l'ajout
public void FillInDictionnary()
{
    foreach (var item in Items)
    {
        if (item is ComboBox)
        {
            ComboBox cb = item as ComboBox;
            //cb.Items disponbile
        }
        else
        {
            ListBox lb = item as ListBox;
            //lb.Items disponbile
        }
    }
}

Shao.

PS: Dans mon exemple code, j'ai mis la propriété auto-implémentée en publique alors qu'elle devrait être privée.
Commenter la réponse de Shaolyne
Messages postés
221
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012
0
Merci
en plus j aurais du faire ca:

public class serializable_liste<T>:serializable_control where T:ListControl

et ca ne va pas, en tout cas merci encore parce que cela m a servi pour une autre classe
Commenter la réponse de l0r3nz1
Messages postés
221
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012
0
Merci
je viens de voir ta réponse,

ca peut marcher!!!
Commenter la réponse de l0r3nz1