Typage dynamique multiple

Résolu
l0r3nz1 Messages postés 218 Date d'inscription mercredi 20 février 2008 Statut Membre Dernière intervention 17 mars 2012 - 9 déc. 2010 à 15:04
l0r3nz1 Messages postés 218 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?

12 réponses

Shaolyne Messages postés 155 Date d'inscription jeudi 12 mai 2005 Statut Membre Dernière intervention 8 mars 2011 1
10 déc. 2010 à 12:45
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.
3
Shaolyne Messages postés 155 Date d'inscription jeudi 12 mai 2005 Statut Membre Dernière intervention 8 mars 2011 1
10 déc. 2010 à 14:11
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.
3
l0r3nz1 Messages postés 218 Date d'inscription mercredi 20 février 2008 Statut Membre Dernière intervention 17 mars 2012
9 déc. 2010 à 17:21
public void ListeConstructor<T>(T listitemcontrol) where T : ListControl {

vu sur msdn

j aurais bien aimé faire se typage dans le construcreur
0
Shaolyne Messages postés 155 Date d'inscription jeudi 12 mai 2005 Statut Membre Dernière intervention 8 mars 2011 1
10 déc. 2010 à 09:00
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
l0r3nz1 Messages postés 218 Date d'inscription mercredi 20 février 2008 Statut Membre Dernière intervention 17 mars 2012
10 déc. 2010 à 12:25
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!
0
l0r3nz1 Messages postés 218 Date d'inscription mercredi 20 février 2008 Statut Membre Dernière intervention 17 mars 2012
10 déc. 2010 à 13:52
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é.
0
l0r3nz1 Messages postés 218 Date d'inscription mercredi 20 février 2008 Statut Membre Dernière intervention 17 mars 2012
10 déc. 2010 à 15:23
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 ;)
0
l0r3nz1 Messages postés 218 Date d'inscription mercredi 20 février 2008 Statut Membre Dernière intervention 17 mars 2012
10 déc. 2010 à 15:27
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 ;)
0
l0r3nz1 Messages postés 218 Date d'inscription mercredi 20 février 2008 Statut Membre Dernière intervention 17 mars 2012
10 déc. 2010 à 15:37
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.
0
Shaolyne Messages postés 155 Date d'inscription jeudi 12 mai 2005 Statut Membre Dernière intervention 8 mars 2011 1
10 déc. 2010 à 15:45
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.
0
l0r3nz1 Messages postés 218 Date d'inscription mercredi 20 février 2008 Statut Membre Dernière intervention 17 mars 2012
10 déc. 2010 à 15:53
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
0
l0r3nz1 Messages postés 218 Date d'inscription mercredi 20 février 2008 Statut Membre Dernière intervention 17 mars 2012
10 déc. 2010 à 16:25
je viens de voir ta réponse,

ca peut marcher!!!
0
Rejoignez-nous