Вызов функции динамически с помощью Reflection - PullRequest
1 голос
/ 10 мая 2010

Я создаю 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. Итак, во второй части кода (исполняющая часть) я просто вызываю функцию execute, Он содержит вызов функции, которую я назвал здесь: display.

Для этого мне нужно установить значения в объявлении с помощью функции setValue. Я хочу, чтобы он вызывался динамически (setValues), который имеет объявление вроде:

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

Для этой ситуации я использовал 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);                                    
     }
}

Но выдает ошибку приведения: «Объект не может быть сохранен в массиве этого типа». в последней строке, в первом параметре для метода (setValue). В чем здесь проблема?

А как я могу вызвать метод динамически после предыдущего кода, (Invoke) или есть лучший способ?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 мая 2010

Спасибо за ваши ответы. Неназванным является setValue, я написал пример кода:

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

Я просто хочу показать вам декларацию:)

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);
  }
}
0 голосов
/ 10 мая 2010

Переменная параметров представляет собой массив ParameterInfo. Таким образом, каждый элемент имеет тип ParameterInfo, а не тип соответствующего параметра. Следует ожидать, что вы не можете привести строку (тип результата свойства Text) к ParameterInfo.

Вам необходимо создать массив объектов того же размера, что и ParameterInfo, и встроить его в цикл for. Затем вы можете использовать экземпляр MethodInfo и вызывать Invoke с этим массивом объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...