反射类型适应

时间:2012-01-11 10:46:46

标签: c# system.reflection

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

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

我需要用Reflection调用它,因为我从“外部”C#接收此输入 软件,我需要评估我需要打电话的女巫方法。

问题是输入i有2个对象通过“提示命令行”, o我已将其转换为字节:

Byte a = 10;
Byte b = 10;

所以,当我执行Refection时,我看到一个错误“找不到方法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);                        
        }
    }
}

基本上每个Param都要通过,我投了它。 之后我动态地传递它:

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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 }); 
}