Тип отражения Адаптируйте - PullRequest
0 голосов
/ 11 января 2012

У меня есть проблема с отражением, в основном мне нужно вызвать метод класса, как этот:

public Int32 addNumer (Int32 a, Int32 b)
{
    return (a+b);
}

И мне нужно вызвать его с помощью Reflection, потому что я получаю этот вход от "внешнего" C #ПО и мне нужно оценить метод ведьмы, который мне нужно вызвать.

Проблема в том, что в качестве ввода у меня есть 2 объекта, переданных "командной строкой приглашения", o я преобразовал его в байт:

Byte a = 10;
Byte b = 10;

Итак, когда я выполняю Refection, я вижу ошибку "not find method addNumber", потому что метод с 2 байтами на входе не был найден.Я думаю, что ожидалось 2 Int32, а не 2 байта.

Как я могу решить это?

D.

ОБНОВЛЕНИЕ 1:

Object result_object = target_class.InvokeMember(method, 
                           BindingFlags.InvokeMethod, null, target_object, 
                           args_values, null, null, args_names);

ОБНОВЛЕНИЕ 2: Я не могу CAST на Int32, потому что я получаю этот вызов из файла EXE:

MyProjectPrompt.exe Namespace.Class.Method param1 param2

Пример:

MyProjectPrompt.exe It.Company.Math.Add 10 10

РЕШЕНИЕ

ParameterInfo[] listaParametr = method_to_invoke.GetParameters();

ParameterInfo infoParam;
for(Int32 va=0;va<listaParametr.Length;va++)
{
    infoParam = listaParametr[va];

    for(Int32 va2=0;va2<args_values.Length;va2++)
    {
        if(args_names[va2]==infoParam.Name)
        {
            args_values[va2] = Convert.ChangeType(args_values[va2], 
                                                  infoParam.ParameterType);                        
        }
    }
}

В основном, чтобы КАЖДЫЙ Парам проходил, я разыгрываю его.После этого я передаю его динамически:

Object result_object = target_class.InvokeMember(method, 
                           BindingFlags.InvokeMethod, null, target_object, 
                           args_values, null, null, args_names);

Ответы [ 2 ]

1 голос
/ 11 января 2012

Используйте Convert.ChangeType, чтобы изменить исходное значение на тип, принятый методом. Будет выброшено исключение, если не найдено подходящего преобразования.

0 голосов
/ 11 января 2012

Это должно работать:

public class Test1
{
    public Int32 addNumer (Int32 a, Int32 b)
    {
         return (a+b);
    }
}


static void Main (string[] args)
{
    Byte a = 10;
    Byte b = 20;

    object test = new Test1();

    //note how I cast a and b to int 
    //int is an alias to Int32

    typeof(Test1).GetMethod("addNumber").Invoke(test, 
                          new object[] { (int)a, (int)b }); 
}
...