如何在 C# 中使用反射调用具有不同类型参数的方法

Posted

技术标签:

【中文标题】如何在 C# 中使用反射调用具有不同类型参数的方法【英文标题】:How to call a method with arguments of different types using reflection in C# 【发布时间】:2011-12-06 02:42:11 【问题描述】:

我正在尝试使用 C# 中的 .NET 反射调用一个接受两个参数(一个布尔值和一个字符串)的函数。但是,使用以下代码我得到一个异常:

object[] paramList = new object[]  true, "Foo" ;

Type wsType = typeof(MyWS);
MyWS inst = (MyWS)Activator.CreateInstance(wsType);
MethodInfo method = wsType.GetMethod(function);    // function = the name of the function to be called
method.Invoke(inst, paramList);

这会引发 ArrayTypeMismatchException(“尝试将元素作为与数组不兼容的类型访问。”)。

似乎是 paramList 导致了异常,但我不知道为什么?

我试图调用的函数类似于:

public bool EnableSchedule(bool enable, string password)

    ...

【问题讨论】:

检查function 变量是否真的包含接受这两个参数的函数的名称。除此之外,您的代码应该可以工作。 数组可以包含不同类型的元素,尤其是对象数组。更好地记录您的问题,显示您尝试调用的类型和方法以及异常的堆栈跟踪。 除非您提供“函数”的定义(或至少声明),否则它可以帮助您找出问题所在。参数顺序不正确?您的函数是否有可能接收 (string, bool) 而不是 (bool, string)? 尝试在paramList 下方添加行function = "EnableSchedule"; 并再次运行。正如@Hans 所说,堆栈跟踪会告诉你问题出在哪里(我敢打赌你只是调用了错误的函数)。 如果方法主体类似于“return true;”,则代码执行没有问题。也许该方法抛出异常而不是您粘贴的这段代码 【参考方案1】:

您所做的似乎没有任何问题 - 除非问题出在“MyWS”中。我假设该课程是公开的。 同时,尝试在 GetMethod() 中添加一些绑定标志,例如

wsType.GetMethod(function, BindingFlags.Static | BindingFlags.Public | BindingFlags.Instance);

【讨论】:

以上是关于如何在 C# 中使用反射调用具有不同类型参数的方法的主要内容,如果未能解决你的问题,请参考以下文章

C# 调用具有不同类型的相同扩展函​​数作为参数(可能是委托?)

C#反射实例学习及注意内容

unity的C#学习——泛型的创建与继承泛型集合类泛型中的约束和反射

C# Specflow:如何在另一个文件夹的类中调用具有动态表作为参数的方法

C#反射执行方法返回List,怎么获取List

C#中反射里的invoke方法的参数