Вы можете создать метод, который принимает параметр делегата, описывающий действие, которое нужно выполнить. Тогда вы можете избавиться от повторного кода.
Вот пример: я создаю публичный метод PerformAction в моей форме. Он принимает делегат Action в качестве аргумента; этот делегат описывает действие, которое следует предпринять.
Метод экземпляра должен использоваться, когда это возможно, но для полноты я создал статическую версию, которая получает экземпляр Form из Form.ActiveForm.
Код выглядит так:
using System;
using System.Windows.Forms;
namespace WinFormTest
{
public partial class MainForm : Form
{
public void PerformAction(Action<MainForm> action)
{
if (InvokeRequired)
Invoke(action,this);
else
action(this);
}
public static void PerformActionOnMainForm(Action<MainForm> action)
{
var form = ActiveForm as MainForm;
if ( form!= null)
form.PerformAction(action);
}
}
}
И затем может использоваться следующим образом:
MainForm.PerformActionOnMainForm(form => form.Text = "My form");
// The action can also be a code block or a method:
MainForm.PerformActionOnMainForm(form =>
{
form.Width = 200;
form.Height = 300;
form.Left = 100;
form.Top = 200;
});
PerformAction также можно сделать универсальным, чтобы вы могли использовать его в любой из ваших форм. Тогда подпись будет:
public void PerformAction<T>(Action<T> action)
where T : Form
{
...
}
Имеет смысл объявить это следующим образом, если у вас есть общий базовый класс, который используется в ваших формах. Кроме того, вы можете создать вспомогательный класс, содержащий метод.