2012-01-11 29 views
0

我有反思的问题,基本上我需要调用类的这样的方法:反射式适应

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

,我需要用反射来调用它,因为我是从“外部”收到此输入C# 软件,我需要评估我需要调用的女巫方法。

的问题是,因为入端i有2个目的是通过“提示命令行”, 传递O I已经在字节将其转换:

Byte a = 10; 
Byte b = 10; 

所以,当我执行便餐看到错误“不能找到方法addNumber“ ,因为没有找到输入中有2个字节的方法。我认为它期望 2 Int32而不是2字节。

我该如何解决?

D.

UPDATE 1:

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

更新2: 因为我收到此呼叫从一个EXE文件我无法投射到的Int32:

MyProjectPrompt.exe Namespace.Class.Method param1 param2 

例如:

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

SOLUTION

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); 
+1

将代码添加到您使用反射查找方法的位置。 – albertjan 2012-01-11 10:49:20

+0

所以你不知道'addNumber'的名字,并且希望找到它,因为它可以用2个字节来调用? – 2012-01-11 10:49:52

+1

如果以上是肯定的,然后尝试获取具有2个相同参数的所有方法的列表,然后基于'IsAssignableFrom'过滤基于' – 2012-01-11 10:50:22

回答

1

使用Convert.ChangeType到原来的值更改为通过该方法接受一个类型。如果找不到合适的转换,它会抛出异常。

+0

我会试试这个...等待 – Dada 2012-01-11 11:50:27

+0

解决这个问题。谢谢。 – Dada 2012-01-11 12:01:49

0

这应该工作:

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

我不能那样做,因为我已经有一个叫做getMethod并且我不知道他的params输入了。 – Dada 2012-01-11 11:49:02

+0

你知道你想要调用的函数的名字吗? – albertjan 2012-01-11 13:27:45