Ну, вы, конечно, можете сделать это проще, чем это. Во-первых, вам не нужны все ваши собственные отдельные типы делегатов - вы можете использовать встроенные Func<...>
и Action<...>
делегаты, если вы используете .NET 3.5, а если нет, вы можете объявить их самостоятельно а затем использовать их в общем.
Другая вещь, которую вы могли бы рассмотреть, - это написание вспомогательного метода (как метода расширения, если вы используете C # 3), а затем использовать анонимные методы (или лямбда-выражения):
internal static void SetElementIsEnabled(UIElement element, bool isEnabled)
{
InvokeIfNecessary(element, delegate
{
element.IsEnabled = isEnabled;
});
}
Вспомогательный метод будет:
public static void InvokeIfNecessary(UIElement element, MethodInvoker action)
{
if (element.Dispatcher.Thread != Thread.CurrentThread)
{
element.Dispatcher.Invoke(DispatcherPriority.Normal, action);
}
else
{
action();
}
}
(Вы, вероятно, также должны включать BeginInvoke
эквивалент. Я обычно предпочитаю BeginInvoke
, если мне не нужно свидание.)