背景#
假定フォームがあり、それは個別のビジネスクラスに依存していますが、ビジネスクラスでフォーム内の UI コントロール(進捗バーなど)を制御したい場合、delegate
(デリゲート)を使用する必要があります。
デリゲートは、メソッドの参照をカプセル化し、参照を他のメソッドにパラメータとして渡すことができます。他のメソッドは、参照を取得した後、それを呼び出すかのように実行します。
ここでは、ビジネスでコンテンツのポップアップを指定する必要があると仮定します。
デリゲートの定義#
Global.cs
ファイルを作成し、デリゲートと必要なパラメータを定義します:
namespace WindowsFormsApp1
{
public class Global
{
// パラメータを持つデリゲートを定義する
public delegate void CallBack(Data data);
}
public class Data
{
public string Name { get; set; }
}
}
BLL#
次に、デリゲートをビジネスメソッドにパラメータとして渡し、デリゲートを実行します:
using System.Threading.Tasks;
using static WindowsFormsApp1.Global;
namespace WindowsFormsApp1
{
public class BLL
{
public void SayHi(CallBack callback) =>
Task.Run(() => { callback(new Data { Name = "bob" }); });
}
}
フォーム#
次に、フォームでデリゲートを初期化し、ビジネス関数を実行する必要があります:
using System.Windows.Forms;
using static WindowsFormsApp1.Global;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// デリゲートをインスタンス化し、デリゲートされる関数を渡す
var callback = new CallBack(AnyMethod);
// ビジネスロジックを指定する
new BLL().SayHi(callback);
}
private void AnyMethod(Data data)
=> MessageBox.Show($"Hi, {data.Name}");
}
}
以上です。
最適化#
C# には、2 つの事前定義されたデリゲートが用意されています:
これにより、自分でデリゲートを定義する必要がなくなりますので、プログラムを変更します。
Global#
Global
クラスを削除します。
BLL#
public void SayHi(Action<Data> callback)
Form#
new BLL().SayHi(new Action<Data>(AnyMethod));