2010-05-10 6 views
1

Je générer des fichiers dll contiennent du code comme l'exemple suivant:appel fonction dynamique en utilisant la réflexion

using System; 
using System.Collections; 
using System.Xml; 
using System.IO; 
using System.Windows.Forms; 

namespace CSharpScripter 
{ 

public class TestClass : CSharpScripter.Command 
{ 
    private int i=1; 
    private int j=2; 
    public int k=3; 

    public TestClass6() 
    { 

    } 

    public void display (int i,int j,int k) 
    { 
     string a = null; 
     a= k.ToString(); 

     string a1 = null; 
     a1= this.i.ToString(); 

     string a2 = null; 
     a2= j.ToString(); 

     MessageBox.Show(" working! "+ "k="+ a +" i="+a1 + " j="+ a2); 
    } 

    public void setValues(int i,int j,int k1) 
    { 
     this.i=i; 
     this.j=j; 
     k=k1; 
    } 

Je compile le code précédent, alors j'exécute un objet à partir du fichier dll. Donc, dans la deuxième partie du code (partie Exécution), je n'appelle que la fonction d'exécution, Il contient un appel pour une fonction, j'ai appelé ici: affichage.

Pour cela, j'ai besoin de définir des valeurs dans la déclaration par une fonction setValue. Je veux qu'il soit appelé dynamiquement (setValeurs), qui a telle déclaration:

public void(Parameter[] parameters) 
{ 
    //some code block here 
} 

Pour cette situation je Reflection.

Type objectType = testClass.GetType(); 
MethodInfo members = objectType.GetMethod("setValues"); 

ParameterInfo[] parameters = members.GetParameters(); 

for(int t = 0; t < parameters.Length; t++) 
{ 
    if (parameters[t]. ParameterType == typeof()) 
    { 
      object value = this.textBox2.Text; 
      parameters.SetValue(Convert.ChangeType(value,parameters[t].ParameterType), t);          
    } 
} 

Mais il renvoie une erreur de casting « l'objet ne peut pas être stocké dans un tableau de ce type. » à la dernière ligne, en premier paramètre pour la méthode (setValue). Quel est le problème ici?

Et comment puis-je appeler la méthode Dynamiquement après le code précédent, par (Invoquer) ou y at-il un meilleur moyen?

Merci.

+2

Veuillez revoir votre formatage :). Mettez le code dans des blocs de code. – Simon

+0

Ouais, j'ai essayé de le faire, mais ça n'a toujours pas de [email protected] ', quelle est cette fonction sans nom en prenant un tableau de paramètres en paramètre? – Timores

Répondre

0

La variable parameters est un tableau de ParameterInfo. Donc chaque élément est de type ParameterInfo, pas du type du paramètre correspondant. Il est à prévoir que vous ne pouvez pas convertir une chaîne (le type résultat de la propriété Text) en un ParameterInfo.

Vous devez créer un tableau d'objets de la même taille que ParameterInfo et le construire dans la boucle for. Vous pouvez ensuite utiliser l'instance MethodInfo et appeler Invoke avec ce tableau d'objets.

0

Merci pour vos réponses. Le sans nom est setValue, j'ai écrit le code exemple ici:

public void setValeurs (int i, int j, int k1) { this.i = i; this.j = j; k = k1; }

Je veux juste vous montrer la déclaration :)

public void (paramètre [] paramètres) { // certains bloc de code ici}

Quoi qu'il en soit, nous pouvons oublier cette partie de la fonction sans nom, il suffit de se concentrer sur ce code:

Type objectType = testClass.GetType();
Membres MethodInfo = objectType.GetMethod ("setValues"); ParameterInfo [] parameters = members.GetParameters(); for (int t = 0; t < parameters.Length; t ++) { Si (paramètres [t] ParameterType == typeof().) { valeur objet = this.textBox2.Text; parameters.SetValue (Convert.ChangeType (valeur, paramètres [t] .ParameterType), t);}}

+0

Je suis d'accord pour mettre l'accent sur la partie restante (bien que vous ne devriez pas confondre les gens avec un code sans rapport). Veuillez regarder la 2ème partie de ma réponse ci-dessus. – Timores

Questions connexes