C# 3.0 i po:
metodę rozszerzenia na ogół być droga, ponieważ jesteś zawsze będzie chciał, aby wykonać działanie na realizację ISynchronizeInvoke
interface, że to dobry wybór projektu.
Możesz również skorzystać z anonymous methods (zamknięć), aby uwzględnić fakt, że nie wiesz, jakie parametry przekazać do metody rozszerzenia; zamknięcie uchwyci stan wszystkiego, czego potrzebuje.
// Extension method.
static void SynchronizedInvoke(this ISynchronizeInvoke sync, Action action)
{
// If the invoke is not required, then invoke here and get out.
if (!sync.InvokeRequired)
{
// Execute action.
action();
// Get out.
return;
}
// Marshal to the required context.
sync.Invoke(action, new object[] { });
}
Byłbyś wtedy nazwać tak:
private void SetText(string text)
{
textBox1.SynchronizedInvoke(() => textBox1.Text = text);
}
Tutaj, zamknięcie jest na parametrze text
, że stan jest rejestrowany i przekazywany jako część Action
delegate przekazany do metody rozszerzenia.
Przed C# 3.0:
Nie masz luksus wyrażeń lambda, ale nadal można uogólniać kod. To niemal tak samo, ale nie metoda rozszerzenie:
static void SynchronizedInvoke(ISynchronizeInvoke sync, Action action)
{
// If the invoke is not required, then invoke here and get out.
if (!sync.InvokeRequired)
{
// Execute action.
action();
// Get out.
return;
}
// Marshal to the required context.
sync.Invoke(action, new object[] { });
}
A potem to nazwać z metody anonimowej składnię:
private void SetText(string text)
{
SynchronizedInvoke(textBox1, delegate() { textBox1.Text = text; });
}
Tak, działa świetnie, jedyne co musisz zauważyć to to, że musisz uwzględnić: using System.ComponentModel; i używając System; –
Wiem, że jest dość stary, ale wciąż pojawia się w górnej części wyszukiwania dla tego rozwiązania ... Problem polega na tym, że zakładasz, że klasa nadrzędna jest statyczna. Nie można dodać statycznego rozszerzenia do zwykłej klasy. Większość formularzy/WPF zawierających interfejs, do którego chcesz uzyskać dostęp, to regularne zajęcia z instancjami. W takich przypadkach pozostaje ci jedyna opcja anonimowego delegata, jak pokazano poniżej. –
@JohnSuit Na pewno możesz dodać metodę statyczną do "zwykłej" klasy. Wersja post 3.0 jest metodą rozszerzenia i pojawiłaby się jako metoda instancji. Wersja pre-3.0 nie musi żyć na klasie, może żyć na innej klasie, lub możesz uczynić metodę instancją, jeśli naprawdę potrzebujesz (ale nie, ponieważ możesz dodać statyczną metodę). – casperOne