Here's my attempts to dynamically call a method using just the name of the method as a string. You may follow a similar line of thought.
The examples below will call a method within the same class.
Here's method signature I am trying to invoke
1 st attempt
Error : methodName is a variable but used like a method
2nd attempt
Error : methodName is a variable but used like a method
3rd attempt
Error Method 'Program.Class.methodName' not found. Issue args does not match the method signature.
4th attempt - Correct method args
Error "Non-static method requires a target. Issue incorrect return type, this case it must be void.
5th attempt - works but
Error oops this creates a entire new object, in this case a new menu.
6th attempt - working properly. Perhaps read the MS doc first.
The examples below will call a method within the same class.
Here's method signature I am trying to invoke
1 | public void GetText(object sender, EventArgs e) //sender is a menuitem |
1 st attempt
1 2 | string methodName = "GetText"; Action<string> myAction = new Action<string>(methodName); |
Error : methodName is a variable but used like a method
2nd attempt
1 2 | string methodName = "GetText"; Func<string, string> funky = new Func<string, string>(methodName); |
Error : methodName is a variable but used like a method
3rd attempt
1 2 3 4 5 6 7 8 | string methodName = "GetText"; Type callerType = this.GetType(); string output = (string)callerType.InvokeMember( methodName, BindingFlags.InvokeMethod, null, null, null); |
Error Method 'Program.Class.methodName' not found. Issue args does not match the method signature.
4th attempt - Correct method args
1 2 3 4 5 6 7 | string output = (string)callerType.InvokeMember( methodName, BindingFlags.InvokeMethod, null, null, new Object[] { sender, e } ); |
Error "Non-static method requires a target. Issue incorrect return type, this case it must be void.
5th attempt - works but
1 2 3 4 5 6 7 8 9 10 | //create instance assuming default constructor object obj = callerType.InvokeMember(null, BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null); callerType.InvokeMember( methodName, BindingFlags.InvokeMethod, null, obj, //this created whole new menu! new Object[] { menuItemMRU, e }); //sender need to be menuItem |
Error oops this creates a entire new object, in this case a new menu.
6th attempt - working properly. Perhaps read the MS doc first.
1 2 3 4 5 6 7 | this.GetType().InvokeMember( methodName, BindingFlags.InvokeMethod | BindingFlags.Instance, null, this, //<-THIS indicatates it being called by this program, class instantiation new object[] { menuItemMRU, e } //args to pass, we are faking a menu-item ); |
No comments:
Post a Comment