Typage dynamique multiple [Résolu]

Signaler
Messages postés
218
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012
-
l0r3nz1
Messages postés
218
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012
-
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?

12 réponses

Messages postés
155
Date d'inscription
jeudi 12 mai 2005
Statut
Membre
Dernière intervention
8 mars 2011
1
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.
Messages postés
155
Date d'inscription
jeudi 12 mai 2005
Statut
Membre
Dernière intervention
8 mars 2011
1
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.
Messages postés
218
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012

public void ListeConstructor<T>(T listitemcontrol) where T : ListControl {

vu sur msdn

j aurais bien aimé faire se typage dans le construcreur
Messages postés
155
Date d'inscription
jeudi 12 mai 2005
Statut
Membre
Dernière intervention
8 mars 2011
1
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.
Messages postés
218
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012

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!
Messages postés
218
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012

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é.
Messages postés
218
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012

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 ;)
Messages postés
218
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012

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 ;)
Messages postés
218
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012

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.
Messages postés
155
Date d'inscription
jeudi 12 mai 2005
Statut
Membre
Dernière intervention
8 mars 2011
1
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.
Messages postés
218
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012

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
Messages postés
218
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012

je viens de voir ta réponse,

ca peut marcher!!!