CRÉATION DYNAMIQUE D'OBJETS

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 - 19 févr. 2007 à 21:12
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 - 20 févr. 2007 à 15:56
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/41547-creation-dynamique-d-objets

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
20 févr. 2007 à 15:56
:)

Bidou : 1, Warny : 0

J'adore ;)
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
20 févr. 2007 à 15:54
Oups, tu as raison, l'erreur venait d'ailleurs dans mon code, c'est corrigé.
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
20 févr. 2007 à 14:35
Mais noooooon, Insert est une méthode privée du Dictionnary, utilisée (entre autre) par l'indexeur.
Pour te convaincre que l'indexeur ajoute bien l'élément dans le dictionary, créer une application console et met ceci dedans :

Dictionary dic = new Dictionary();
dic[1] = "Okay"; // Count 1 1-Okay
dic[2] = "Salut"; // Count 2 1-Okay 2-Salut
dic[2] = "Teste"; // Count 2 1-Okay 2-Teste
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
20 févr. 2007 à 14:08
Je ne fais pas d'erreur. La méthode Insert existe sur la classe List et pas sur la classe Dictionary.
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
20 févr. 2007 à 11:37
Tu fais très certainement une erreur. Pour t'en rendre compte, tu peux donner un coup de Reflector. Pour l'indexeur tu trouves:

public void set_Item(TKey key, TValue value)
{
this.Insert(key, value, false);
}
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
20 févr. 2007 à 11:08
Bidou -> Après que tu me l'ais dit... j'ai testé, il est indispensable, si je n'utilise pas ces lignes de code l'objet n'est pas integré à ma collection.
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
20 févr. 2007 à 10:06
"Pour le test d'existence, il est indispensable."
Non, tu peux bel et bien faire le remplacement que j'ai indiqué plus haut, simplement: creatable[value] = type;
L'indexeur se charge de tout...
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
20 févr. 2007 à 09:39
Question purement "esthétique", pourquoi écrire :
public Loader() : this("") { ;}

Alors qu'il suffit d'écrire :
public Loader() : this("") { }
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
20 févr. 2007 à 07:44
Merci pour tes remarques, je vais mettre en place une vraie exception dans le createinstance (le plantage est voulu). Pour le test d'existence, il est indispensable.

Sinon, pour la création des plugins, il est clair que des interfaces c'est bien, mais certains objets ont parfois une activité dont on ne peut pas se passer. Même dans ce cas, il faut pouvoir charger ces objets, si on doit tout recompiler, ce n'est pas très interressant, c'est l'utilité de mon programme.
L'idée de base était de reprendre ma source client DNS et de pouvoir l'étendre à l'envie en rajoutant des extensions sans modifier le programme de base comme je dois le faire aujourd'hui.
Or, pour celle-ci, je reçois un numéro de service que je dois interpréter. Comme je ne vais pas utiliser le numéro de service pour nommer mes classes (mais bien le nom du service) il fallait que je trouve une solution... la voici.
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
19 févr. 2007 à 21:17
Quelques remarques:

- Méthodes AddType(Type type) de Loads.cs
if(KeyElement.Lenght > 0) devrait plutôt être string.IsNullOrEmpty(KeyElement)

- Dans la même méthode:

if (creatable.ContainsKey(value))
{
creatable[value] = type;
}
else
{
creatable.Add(value, type);
}

peut-etre remplacé par

creatable[value] = type;


Si on passe une valeur inexistante dans le loader.Create, le program bug. Il faut faire un teste dans la méthode qui fait le CreateInstance (si je ne spécifie pas defaultElement, il est null => plantage)
Autre chose, 'value' est un mot clef, c'est pas recommandé de l'utiliser comme nom de variable.

Sinon pour la création des Plugins, je me demande si c'est pas plus indiqué de passer par des interfaces plutôt que Reflexion...
A voir.
Rejoignez-nous