2009-08-20 11 views
1

J'utilise GetParameter pour déterminer les paramètres dont le constructeur a besoin. Je peux en avoir une liste. Maintenant, je veux invoquer le ctor. Est-ce possible s'il n'y en a pas vide?Est-il possible d'invoquer dynamiquement un constructeur en utilisant relfection s'il n'y a pas de constructeur par défaut vide?

+2

Quelle langue? Je sais que c'est possible en Java, mais il y a un certain nombre d'autres langages qui supportent ce type de réflexion (comme C#). – Jonathan

+0

C# à coup sûr. Merci les amis. Je vais essayer un peu de ça. À votre santé. – topwik

Répondre

3

Quelle langue? Pour C#, vous pouvez utiliser

Activator.CreateInstance(typeof(X), constructorparm1, constructorparam2...) 
+0

alors qu'est-ce que je reçois? un objet générique? que je peux lancer au type que j'ai affaire? – topwik

+0

Vous récupérez un objet. Vous devez le transformer ou utiliser l'opérateur AS pour obtenir l'objet comme type: X instance = (X) Activator.CreateInstance (typeof (X), constructorparm1, constructorparam2 ...) – saret

+0

Je pense que la question Je dois demander alors comment est-ce que je crée un type de système d'un ParameterInfo? Je reçois une liste de paramètres pour mon ctor. Je reviens paramInfo qui me dit que les 2 premiers sont des bools et les 2 autres sont des ints. Maintenant, j'ai besoin de créer un tableau qui contient 2 booléens, soit vrai ou flase bien sûr (basé sur l'entrée utilisateur de l'interface utilisateur ou autre), et 2 entrées définies par l'utilisateur à partir de l'interface utilisateur ... – topwik

1

Est-ce ce que vous cherchez? Cela crée une instance de SqlConnection en transmettant une chaîne au constructeur. Si vous voulez transmettre plus de valeurs, ajoutez-les simplement au tableau.

 SqlConnection conn; 
     conn = (SqlConnection)System.Activator.CreateInstance(typeof(SqlConnection), new object[] { "Server=myserver" }); 
     Console.WriteLine(conn.ConnectionString); 
+0

oui! mais mes paramètres doivent être plus dynamiques que ça. J'ai besoin de regarder le constructeur et s'il a des paramètres, je dois regarder chaque paramètre et obtenir son type de système, comme boolean ou int, puis construire un tableau de ces paramètres, en définissant leur valeur, puis en passant à la création instance ou ctor.invoke ... ParameterInfo [] pi = t.GetConstructors() [0] .GetParameters(); foreach (ParameterInfo p in pi) { if (p est une valeur booléenne) {args [idx] = new Boolean (true); } } Je ne sais pas. Quelque chose comme ça. Je ne suis pas sûr de ce qui est possible. } – topwik

+0

Type realType = Type.GetType (paramInfo.ParameterType.FullName); pourrait faire l'affaire. – topwik

+0

Oubliez ça. Bien qu'il y ait probablement une façon alambiquée de faire cela, je vais m'assurer que chacun des types déclarés dans mon assembly a un constructeur vide par défaut, donc je n'ai pas à me soucier des params lors de l'obtention de l'objet. Ensuite, il devrait être juste une question de passer en revue les propriétés et de définir les valeurs sur eux ... j'espère que c'est plus facile. Des commentaires? N'importe qui? Si c'est aussi difficile, SO va certainement voir une autre question de ma part! – topwik