首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反射类型适配

反射类型适配
EN

Stack Overflow用户
提问于 2012-01-11 10:46:45
回答 2查看 128关注 0票数 0

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

代码语言:javascript
复制
public Int32 addNumer (Int32 a, Int32 b)
{
    return (a+b);
}

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

问题是,作为输入,我有两个对象通过“提示符命令行”传递,o我在Byte中转换了它:

代码语言:javascript
复制
Byte a = 10;
Byte b = 10;

因此,当我执行“刷新”时,我会看到一个错误“无法找到方法addNumber”,因为没有找到输入为2字节的方法。我认为它期望的是2 Int32而不是2 Byte。

我怎么能解决这个问题?

D。

更新1:

代码语言:javascript
复制
Object result_object = target_class.InvokeMember(method, 
                           BindingFlags.InvokeMethod, null, target_object, 
                           args_values, null, null, args_names);

更新2:无法转换为Int32,因为我从EXE文件接收到此调用:

代码语言:javascript
复制
MyProjectPrompt.exe Namespace.Class.Method param1 param2

示例:

代码语言:javascript
复制
MyProjectPrompt.exe It.Company.Math.Add 10 10

溶液

代码语言:javascript
复制
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);                        
        }
    }
}

基本上每一个帕拉姆通过,我投它。之后,我动态地传递它:

代码语言:javascript
复制
Object result_object = target_class.InvokeMember(method, 
                           BindingFlags.InvokeMethod, null, target_object, 
                           args_values, null, null, args_names);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-11 10:55:15

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

票数 1
EN

Stack Overflow用户

发布于 2012-01-11 10:51:16

这应该是可行的:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8817959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档