MissingMemberException:调用方法时未找到方法

MissingMemberException: Method Not Found when invoking a method

我正在学习如何根据作为字符串传递的方法名称动态调用方法。我能理解的最好方法是调用一个方法。我试图通过传递其 class 名称和方法名称来调用方法。但它总是给我例外

Method not found.

我已尝试清理并重建所有内容。还是不行。

namespace TestInvoking
{
    class Invoke
    {
        public string InvokeMember(string method, string para)
        {
            try
            {
                string Result = (string)typeof(Invoke).InvokeMember(method, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static | BindingFlags.IgnoreCase
                                        | BindingFlags.NonPublic | BindingFlags.InvokeMethod,
                                        null, null, new Object[] { para });
                return Result;
            }
            catch (MissingMemberException e)
            {
                MessageBox.Show("Unable to access the testMethod field: {0}", e.Message);
                return null;
            }
        }

        public void testMethod(string tri)
        {
            MessageBox.Show("methodInvoked - {0}", tri);
        }
    }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Invoke methodInvoke = new Invoke();
            text.Text = methodInvoke.InvokeMember("testMethod", "Method_Invoked");
        }

你有几个问题。

  1. 您正在传递 BindingFlags.Static 但该方法不是静态的。
  2. 您正在将 null 传递给目标。只要 InvokeMember 不是 静态的,因此你已经有了一个实例,你可以通过 参数.

完成这两项更改后,代码将如下所示。

class Invoke
{
    public string InvokeMember(string method, string para)
    {
        try
        {
            string Result = (string)typeof(Invoke).InvokeMember(method, BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, this, new Object[] { para });
            return Result;
        }
        catch (MissingMemberException e)
        {
            MessageBox.Show("Unable to access the testMethod field: {0}", e.Message);
            return null;
        }
    }

    public void testMethod(string tri)
    {
        MessageBox.Show("methodInvoked - {0}", tri);
    }


}