使用Reflection获取带参数的静态方法

时间:2012-06-20 10:14:08

标签: c# reflection

我正在使用公共静态类和静态方法及其参数:

public static class WLR3Logon
{
   static void getLogon(int accountTypeID)
   {}
}

现在我尝试将带有参数的方法提取到另一个类中并使用以下代码:

MethodInfo inf = typeof(WLR3Logon).GetMethod("getLogon",
    BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy);

int[] parameters = { accountTypeId };

foreach (int parameter in parameters)
{
    inf.Invoke("getLogon", parameters);
}

但是它给了我错误

  

“对象引用未设置为对象的实例。”

我哪里出错了。

4 个答案:

答案 0 :(得分:12)

使用以下方法解决了这个问题:

using System.Reflection;    
string methodName = "getLogon";
Type type = typeof(WLR3Logon);
MethodInfo info = type.GetMethod(
    methodName, 
    BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);

object value = info.Invoke(null, new object[] { accountTypeId } );

答案 1 :(得分:5)

这里有很多问题

  • 您的静态方法是私有的,但您选择仅在公开可见访问时过滤的方法。要么使您的方法公开,要么确保绑定标志包含私有方法。现在,没有方法会在inf中返回null,这会导致你的null-ref异常。
  • 参数是一个int数组,其中MethodInfo需要一个对象数组。您需要确保传入一组对象。
  • 循环遍历参数仅用于使用整个参数集多次调用该方法。移除循环。
  • 使用方法的名称调用MethodInfo.Invoke作为第一个参数,这是无用的,因为当参数是实例方法时,此参数是实例。在您的情况下,此参数将被忽略

答案 2 :(得分:3)

您的方法是私有的,因为您没有明确声明访问修饰符。您有两种方法可以使代码按预期工作:

  • 将您的方法更改为public
  • BindingFlags.NonPublic来电
  • 中指定GetMethod

答案 3 :(得分:1)

制作方法public。它应该在那之后工作

 public static class WLR3Logon
 {
       public static void getLogon(int accountTypeID)
       {}
 }