非静态方法需要目标C#

我有一个win表单应用程序,其中列表框显示方法(按属性)。 我试图动态调用线程中的方法,使用reflection从列表框的选定值获取方法信息。 但是,当调用Methodinfo.Invoke时,我得到了这个内部exception“非静态方法需要一个目标C#”。

这是我的代码(请记住,我仍然是c#和编程的新手。)

private void PopulateComboBox() {//Populates list box by getting methods with declared attributes MethodInfo[] methods = typeof(MainForm).GetMethods(); MyToken token = null; List<KeyValuePair> items = new List<KeyValuePair>(); foreach (MethodInfo method in methods) { token = Attribute.GetCustomAttribute(method, typeof(MyToken), false) as MyToken; if (token == null) continue; items.Add(new KeyValuePair( token.DisplayName, method)); } testListBox.DataSource = items; testListBox.DisplayMember = "Key"; testListBox.ValueMember = "Value"; } public void GetTest() {//The next two methods handle selected value of the listbox and invoke the method. if (testListBox.InvokeRequired) testListBox.BeginInvoke(new DelegateForTest(functionForTestListBox)); else functionForTestListBox(); } public void functionForTestListBox() { _t = testListBox.SelectedIndex; if (_t < 0) return; _v = testListBox.SelectedValue; method = _v as MethodInfo; if (method == null) return; _selectedMethod = method.Name; MessageBox.Show(_selectedMethod.ToString()); method.Invoke(null, null);//<----Not sure about this. it runs fine when I dont invoke in a thread. counter++; } private void runTestButton_Click(object sender, EventArgs e) {// Click event that calls the selected method in the thread if (_serverStatus == "Running") { if (_testStatus == "Not Running") { // create Instance new Thread and add function // which will do some work try { SetupTestEnv(); //functionForOutputTextBox(); Thread UIthread = new Thread(new ThreadStart(GetTest)); UIthread.Name = "UIThread"; UIthread.Start(); // Update test status _testStatus = "Running"; //Make thread global _UIthread = UIthread; } catch { MessageBox.Show("There was an error at during the test setup(Note: You must install each web browser on your local machine before attempting to test on them)."); } } else { MessageBox.Show("Please stop the current test before attempt to start a new one"); } } else { MessageBox.Show("Please make sure the server is running"); } } 

您试图在不提供对象实例引用的情况下调用非静态方法,应该调用此方法。 由于您正在使用MainForm类的方法,因此您应该在MethodInfo.Invoke(Object, Object[])的第一个参数中提供MainForm类型的MethodInfo.Invoke(Object, Object[]) ,在您的情况下:

 if(method.IsStatic) method.Invoke(null, null); else method.Invoke(this, null); 

在单独的线程上执行方法的示例:

 public MethodInfo GetSelectedMethod() { var index = testListBox.SelectedIndex; if (index < 0) return; var value = testListBox.SelectedValue; return value as MethodInfo; } private void ThreadProc(object arg) { var method = (MethodInfo)arg; if(method.IsStatic) method.Invoke(null, null) else method.Invoke(this, null); } private void RunThread() { var method = GetSelectedMethod(); if(method == null) return; var thread = new Thread(ThreadProc) { Name = "UIThread", }; thread.Start(method); }