2009-07-19 3 views
8

Zuerst ich benutze VS2005 und C# 2.0.C# 2.0-Generika: Wie man ein Action-Objekt mit Null-Parameter

Ich versuche eine Combobox Text Eigenschaft aus dem SelectedIndexChanged Ereignis zu setzen. Von einer anderen thread hier auf Stackoverflow wurde dies auf folgende Weise vorgeschlagen, getan:

BeginInvoke(new Action(() => someCombobox.Text = "x")); 

Nun, zunächst einmal diese gibt für mich einen Compiler-Fehler. Ich glaube, das liegt daran, dass sich das Action-Objekt in den beiden Sprachspezifikationen anders verhält. In C# 2.0 scheint das Action-Objekt die Struktur <T> in allen Deklarationen zu benötigen. Vielleicht liege ich falsch, aber ich hätte das gern geklärt.

Was Arbeit tut, ist der folgende:

BeginInvoke(new Action<string>(delegate { someCombobox.Text = "x"; }), new object[] { "" }); 

Es ist jedoch nur für mich sehr seltsam scheint, dass ich mit einem Typ-Parameter die Aktion definieren bezwecken (vor allem, da ich bin nicht die Absicht hat übergeben Sie irgendwelche Parameter)! Irgendwie würde das Entfernen dieses Parameters das leere neue Objekt [] überflüssig machen, was ich will.

Kann jemand mir helfen, den oben genannten Anruf zu vereinfachen?

Ist schließlich garantiert, dass BeginInvoke nach dem SelectedIndexChanged beendet und damit die Texteigenschaft der Combobox mit dem richtigen Text aktualisiert?

Ich würde wirklich gerne die Antworten auf diese Fragen zu lernen.

+0

Der Kompilierungsfehler ist wegen des Lambda-Ausdrucks. Lambdas sind neu in C# 3.0 und sind eine Kurzform der Syntax für die Delegatenerstellung. –

Antwort

9

Ich glaube nicht, Aktion ohne Parameter ist in .NET 2.0 verfügbar Keine Sorge - verwenden Sie einfach einen anderen vordefinierten Delegate-Typ. MethodInvoker sollte den Job erledigen (void-Methode ohne Parameter).

Außerdem hat BeginInvoke 2 Überladungen - eine, die einen Delegaten nimmt, und eine, die einen Delegaten und ein Array von Objekten übernimmt.

BeginInvoke(new MethodInvoker(delegate() 
{ 
    someCombobox.Text = "x"; 
})); 
+0

Ich habe 'MethodInvoker' oft benutzt, bevor' System.Action' kam. :) –

9

Sie könnten Ihren eigenen Aktionsdelegaten definieren.

delegate void Action()

kann ich sehen, das Objekt nicht auf den Sie BeginInvoke anrufen, aber wenn es ein UI-Steuerelement auf dem gleichen Thread wie die Combobox erstellt ist, der Delegierten Sie passieren wird garantiert einige aufgerufen werden Zeit nach Abschluss des SelectedIndexChanged-Ereignishandlers.