按名称调用非静态方法

时间:2011-08-28 03:00:56

标签: c# .net methods static instance

我一直在尝试按名称调用方法,但问题是我调用的方法不能是静态的,而且需要属于当前类。

我已经尝试过这样做的方式:

public static void InvokeMenuMethod(string methodName, object sender, EventArgs e)
  Type calledType = Type.GetType("MyNamespace.MyClass");
  calledType.InvokeMember(
    methodName,
    BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static,
    null,
    null,
    new object[] { sender, e }
  );
}

这显然只适用于静态成员,所以我尝试了类似这样的东西

public static void InvokeMenuMethod(string methodName, object sender, EventArgs e)
  Type calledType = Type.GetType("this");
  calledType.InvokeMember(
    methodName,
    BindingFlags.InvokeMethod | BindingFlags.Public,
    null,
    null,
    new object[] { sender, e }
  );
}

但我得到Must specify binding flags describing the invoke operation required (BindingFlags.InvokeMethod CreateInstance GetField SetField GetProperty SetProperty). Parameter name: bindingFlags错误...

那我怎么能这样做呢?

修改

所以:

public void InvokeMenuMethod(string methodName, object sender, EventArgs e) {
    Type.GetType("this").InvokeMember(
        methodName,
        BindingFlags.InvokeMethod,
        null,
        this,
        new object[] { sender, e }
    );
}

提供NullReferenceException

解决方案: Type.GetType("this")

中没有“this”

2 个答案:

答案 0 :(得分:12)

 this.GetType().InvokeMember(
    methodName,
    BindingFlags.InvokeMethod,
    null,
    this,
    new object[] { sender, e }
  );

来自MSDN

  

如果自己指定了InvokeMethod,那么BindingFlags.Public,   BindingFlags.Instance和BindingFlags.Static是自动的   包括

答案 1 :(得分:0)

您可以添加BingingFlags.Instance