Non méthode statique nécessite une cible C#
J'ai un win formulaire d'application avec une zone de liste afficher méthodes (par attribut). Je cherche à invoquer dynamiquement des méthodes dans un fil de discussion, en utilisant la réflexion de méthode d'obtenir des informations à partir de la valeur sélectionnée de la zone de liste. Cependant, lors de l'appel de Methodinfo.Invoquer je reçois cette exception interne "Non-statique méthode nécessite une cible C#".
Voici mon code (gardez à l'esprit que je suis encore novice en c# et la programmation en général.)
private void PopulateComboBox()
{//Populates list box by getting methods with declared attributes
MethodInfo[] methods = typeof(MainForm).GetMethods();
MyToken token = null;
List<KeyValuePair<String, MethodInfo>> items =
new List<KeyValuePair<string, MethodInfo>>();
foreach (MethodInfo method in methods)
{
token = Attribute.GetCustomAttribute(method,
typeof(MyToken), false) as MyToken;
if (token == null)
continue;
items.Add(new KeyValuePair<String, MethodInfo>(
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");
}
}
OriginalL'auteur don_mega | 2011-01-02
Vous devez vous connecter pour publier un commentaire.
Vous essayez d'invoquer la non-méthode statique sans fournir d'instance de l'objet de référence, pour laquelle cette méthode doit être appelée. Puisque vous travaillez avec des méthodes de
MainForm
classe, vous devez fournir l'objet deMainForm
type dans le premier paramètre deMethodInfo.Invoke(Object, Object[])
, dans votre cas:Exemple de méthode d'exécution sur le thread séparé:
Vous êtes explicitement l'appel de cette méthode sur mainform thread à l'aide de
testListBox.BeginInvoke()
.MethodInfo.Invoke()
effectue sur le fil à partir de laquelle il a été appelé.Ah, je vois. Eh bien, il ressemble à un je vais repenser mon code. Avez-vous des idées sur comment je pourrais faire pour obtenir la méthode à invoquer dans un thread différent du formulaire principal?
Vous avez juste besoin de passer méthode choisie pour votre "UIThread" (regardez
Thread(ParameterizedThreadStart)
constructeur par exemple, qui permet le passage d'un paramètre). Appelez ensuiteMethodInfo.Invoke(this, null)
sansControl.BeginInvoke
dans votre fonction de thread.Pourriez-vous nous donner un exemple de code?
OriginalL'auteur max