Voilà, c'est mon premier message sur ce blog, et on va donc commencer tout doucement avec un petit peu de (System.)Reflection.
L'autre jour, Patrice me demandais un truc qui me parraissait tout bète : Comment faire pour instancier un contrôle Windows Form et l'afficher dans une fenêtre sans connaitre au préalable son type ? (c'est à dire que l'interface nous propose une text box dans laquelle on rentre le type sous forme de chaîne de caractères du contrôle à afficher).
Je pars donc bille en tête et roulant des méchaniques du genre "Les doigts dans le nez !", et me vautre lamentablement en lui sortant un bout de code qui me parraissait absoluement infaillible :
Control
ctrl = (Control) Type.GetType("System.Windows.Forms.TextBox").GetConstructor(new Type[] { }).Invoke(null);
this.Controls.Add(ctrl);
Outre le fait que ce bout de code n'est pas franchement d'une lisibilité éxemplaire, je me mange une grosse NullReferenceException qui tache...
Alors que s'est il passé ?
En fait l'erreur vient du Type.GetType. En effet la méthode attend bien le nom du type mais aussi le nom pleinement qualifié de l'assembly dans lequel il est définit ! Fort de cette constation, voilà le code que j'ai écrit :
Type type = Type.GetType("System.Windows.Forms.TextBox,
System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
Control ctrl = (Control)
type.GetConstructor(new Type[]
{ }).Invoke(null); this.Controls.Add(ctrl);
Forcément, là ca marche beaucoup mieux. Mais maintenant, je me pose une question : Comment faire pour instancier un type en ne connaissant que son nom, et sans connaître à priori dans quelle assembly il est définit (mais en considérant que cette assembly est accessible au programme en cours) ?
Si vous avez un début de réponse, merci d'en faire profiter la communauté...