вызывать нестатический метод по имени - PullRequest
9 голосов
/ 28 августа 2011

Я пытался вызвать метод по имени, но проблема в том, что метод, который я вызываю, не может быть статическим, и он должен быть текущего класса.

Я пробовал способ сделать этокак это:

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

Решение: Нет "this" в Type.GetType("this")

Ответы [ 2 ]

12 голосов
/ 28 августа 2011

try

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

С MSDN

Если InvokeMethod указан сам по себе, BindingFlags.Public, BindingFlags.Instance и BindingFlags.Staticавтоматически включается

0 голосов
/ 28 августа 2011

Вы можете добавить BingingFlags.Instance.

...