Salut,
mon problème est le suivant : je me trouve avec un string contenant le nom d'une classe. J'aimerai pouvoir récupéré le Type de cette classe afin de l'instancier. Comment procéder ?
Merci d'avance.
Version imprimable
Salut,
mon problème est le suivant : je me trouve avec un string contenant le nom d'une classe. J'aimerai pouvoir récupéré le Type de cette classe afin de l'instancier. Comment procéder ?
Merci d'avance.
Euh, la classe existe déjà ou non ?
Tu veux instancié un objet de type : la classe contenue dans la string ?
ou tu veux créer une classe carrément ?
Je ne veux pas que la classe soit instancié de façon explicite, en dur dans le code. Je veux me donner la possibilité d'instancier un objet d'une classe dont le nom est seulement passé dans un string.
Et si possible je ne veux pas que la classe qui va permettre l'instanciation connaisse autre chose qu'un interface implémentée par la classe dont on connait juste le nom dans le string. Les classes (instanciante et instanciée) font partie du même namespace cependant.
Suis-je clair ? :aie:
Je vois, mais quel est le but ?
Avec une interface ou une classe abstraite cela n'irait pas ?
Petite précision : un wrapper avec une table de correspondance nom-classe ne me conviendrait pas spécialement, ça serait vraiment ma "solution de sauvetage" faute de mieux ...
:oops:
Peut-être avec des classes génériques, y as-tu pensé ?
Je ne sais pas trop, désolé je suis nouveau en C# :oops:
J'aimerai faire quelque chose du genre
je ne sais pas si c'est plus clair ?Code:
1
2
3
4 string type = node.Current.Value; ... Type classe = Type.GetType(type); classe mod = new classe(...);
Tu peux le faire avec Assembly.CreateInstance( nom du type)
En recherchant j'ai réussi à adapter un peu un exemple de la FAQ que je n'avais pas trop saisi en premier lieu.
J'ai modifié mon code pour arriver à celui qui suit :
sachant que le type classe implémente IModule.Code:
1
2
3
4
5 string type = node.Current.Value; ... Type classe = Type.GetType(type); object obj = System.Activator.CreateInstance(classe, ...); IModule mod = obj as IModule;
Est-ce que ça va bien me donner ce que j'espère ?
je ne sais pas si ça revient exactement à ce que j'ai proposé au-dessus, mais le pb reste le même : je ne veux pas faire apparaitre le type "final" de façon explicite => de quel type doit être l'objet ou la référence sur le résultat de Assembly.CreateInstance( nom du type) (pour suivre ton exemple)?
Si l'on en croit l'article C#4 : un typage dynamique des objets de Didier Girard :Je pense donc que le dernier code que j'avais mis marchera correctement.Citation:
Invocation, d'une méthode Add en utilisant le typage dynamique de C# 4. La résolution de type, le fait que "10" et "20" sont des entiers se fera à l'exécutionCode:
1
2 dynamic calc = GetCalculator(); int sum = calc.Add(10, 20);
Si quelqu'un a quelque chose à dire n'hésitez pas , toute remarque est la bienvenue :mrgreen:
dynamic est un mot clé rajouté par C#4.
Pour ton problème précis, c'est bien Activator.CreateInstance qu'il faut utiliser. Ce code :n'est pas concevable en .Net parce que "classe" n'est pas connu de façon statique, à la compilation. C'est pour ça que Activator.CreateInstance renvoie un object.Code:classe mod = ...;
Que veux tu faire de l'objet, une fois qu'il est créé ?
L'objet une fois instancié servira à traiter des jobs :
- il peut réimplémenter des méthodes de IModule pour sa gestion interne
- il dispose de fonctions qui implémente la signatureafin de réaliser les jobsCode:public delegate void Run(ref Message mess);
Ça parait réalisable ? :aie:
D'ailleurs à ce propos, si j'ai défini un fonction, "implémentant" Run,comme suit :
Comment l'appeler sachant que je dispose de :Code:public void Traitement1(ref Message mess){...}
C'est en fait le même problème que précédemment, mais avec un nom de fonction au lieu d'un nom de classe. et dans ce dernier cas je n'ai pas à me soucier de l'instanciation : on suppose que l'objet d'où provient la méthode est déjà créé en mémoire.Code:string nomfonction = "Traitement1";
Merci d'avance :wink:
Fouille la doc du namespace System.Reflection. Par exemple, pour exécuter une méthode à partir de son nom, il y a un truc du style :C'est approximatif, mais tu vois l'idée :)Code:
1
2 MethodInfo m = typeof(MonType).GetMethod("Run"); m.Invoke(new object[] {paramètre1, paramètre2});
Oui j'ai trouvé ça aussi, mais ça ne répond pas à mes attentes.
Je ne veux pas recompiler du code à la volée, mais je veux appeler dynamiquement la méthode d'une classe que je sais instanciée (ce qui n'est pas le cas de la méthode que tu proposes, enfin il me semble). Du côté de System.Reflection je n'ai rien trouvé pour faire ça, j'ai donc opté pour un tableau de correspondance dans le classe, qui contient la méthode que je souhaite appeler, afin de faire la relation entre une référence à cette méthode et le string qui contient son nom (ou ce qu'on veut d'ailleurs).
En tout cas merci pour ton aide, et n'hésite pas à me corriger si je dis des conneries :aie:
C'est peut être ça que tu cherche ?
http://msdn.microsoft.com/fr-fr/library/66btctbe.aspx
Merci c'est ce que je cherchais, je le garde sous le coude pour comparer avec ma méthode avec tableau.
:ccool:
J'ai un petit soucis avec Type. GetType ... 8O
En effet j'ai un classe comme ceci :
Type.GetType me renvoie systématiquement null ...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 namespace Projet { public class A { ... static void Main(string[] args) { ... string type = "A"; Type classe = Type.GetType(type); ... } } }
Quelqu'un voit d'où pourrait venir mon problème svp ?
PS : si je précise le namespace je n'ai pas d'erreurcependant je ne comprends pas pourquoi je devrai le préciser vu que le Main appartient à un classe faisant partie de ce namespace.Code:string type = "Projet.A";
Parce que quand la méthode Type.GetType est exécutée, il n'y a pas de "contexte" indiquant qu'on se "trouverait" dans le namespace TrucMuche.Bidule.
T'imagine le bordel si une méthode se comportait différemment selon l'endroit d'où elle est appelée ? :aie:
Un namespace, ce n'est qu'un préfixe au nom des objets. C'est tout.