如何在 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# 调用具有不同类型的相同扩展函数作为参数(可能是委托?)
unity的C#学习——泛型的创建与继承泛型集合类泛型中的约束和反射