2010-05-10 64 views
1

我生成DLL文件包含如以下示例代码:调用函数动态通过使用反射

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; 
    } 

我编译前面的代码,然后我从DLL文件执行的对象。 因此,在代码的第二部分(执行部分),我只是调用执行功能, 它包含一个函数调用,我在这里命名为:display。

为此,我需要通过setValue函数在声明中设置值。 我希望它是动态的(setValues方法)调用,它具有类似的声明:

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

对于这种情况,我用思考。

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);          
    } 
} 

但它会抛出一个转换错误“对象不能存储在这种类型的数组中”。在最后一行,在(setValue)方法的第一个参数中。 这里有什么问题?

如何在前面的代码之后动态调用方法(Invoke)还是有更好的方法?

谢谢。

+2

请检查您的格式:)。将代码放入代码块中。 – Simon 2010-05-10 18:33:41

+0

是的,我试图做到这一点,但它仍然不完全合理。@Alaa',这个以参数数组为参数的未命名函数是什么? – Timores 2010-05-10 18:50:14

回答

0

参数变量是一个ParameterInfo数组。因此,每个元素的类型都是ParameterInfo,而不是相应参数的类型。预计您不能将字符串(Text属性的结果类型)转换为ParameterInfo。

您需要创建一个与ParameterInfo大小相同的对象数组,并将其构建到for循环中。然后,您可以使用MethodInfo实例并使用此对象数组调用Invoke。

0

感谢您的回答。 未命名是的setValue,我写的示例代码在这里:

公共无效setValues方法(INT I,诠释J,INT K1) { this.i I =; this.j = j; k = k1; }

我只是想告诉你的声明:)

公共无效(参数[]参数) {// 一些代码块在这里 }

无论如何,我们不能忘记这部分的未命名函数,只关注此代码:

类型objectType = testClass.GetType();
MethodInfo members = objectType.GetMethod(“setValues”); ParameterInfo [] parameters = members.GetParameters();对于(int t = 0; t < parameters.Length; t ++) { If(parameters [t]。ParameterType == typeof()) { object value = this.textBox2.Text;参数SetValue(Convert.ChangeType(value,parameters [t] .ParameterType),t);}}

+0

我同意专注于其余部分(尽管您不应该将人们与不相关的代码混淆)。请看上面我的答案的第二部分。 – Timores 2010-05-10 22:31:13