デリゲートが SO で多くのことを行ってきたことは知っていますが、自分のものを見るまでクリックしないことがあります。次のフォーム コードを見て、改善できることがわかりました。
使用したいメソッドを含む「モデルクラス」「_model」を使用していることに注意してください。
- _model.LoadItemType1 は文字列を受け取りますが、値を返しません (テキストを読み込んでオブジェクトを構築します)。
- _model.LoadTotallyDifferentItem も文字列を取りますが、異なるオブジェクトを構築します。
(どちらのメソッドにも、パラメーターを取らないオーバーロードがあります。これは複雑なことですか?)
... ... ...
private string Item1;
private string Item2;
private void button1Click(object sender, EventArgs e)
{
OpenFileDialog OFD = new OpenFileDialog();
if (OFD.ShowDialog() == DialogResult.OK)
{
// Removed TRY-CATCH block for simplicity
Item1= OFD.FileName;
_model.LoadItemType1(Item1);
}
//Some other code to update form etc.
}
private void button2Click(object sender, EventArgs e)
{
OpenFileDialog OFD = new OpenFileDialog();
if (OFD.ShowDialog() == DialogResult.OK)
{
// Removed TRY-CATCH block for simplicity
Item2 = OFD.FileName;
_model.LoadTotallyDifferentItem(Item2 );
}
//Some other code to update form etc.
}
それらの周りのものはすべて似ています. 私は、実行中のメソッドを単純に渡すもの、つまり _model.LoadItemType1 を使用して、try-catch およびその他のコードを実行する 1 つのメソッドを使用できるはずだと考えました。私のビジョンはこのようになります...
string Item1;
string Item2;
private void DoThis( /* take my Method namne here */, ref string s )
{
// all the code from above but with the appropriate method and string reference
}
private void button1Click(object sender, EventArgs e)
{
DoThis(_model.LoadItemType1, ref Item1);
}
private void button2Click(object sender, EventArgs e)
{
DoThis(_model.LoadTotallyDifferentItem, ref Item2);
}
これにより、ファイル タイプを読み込むボタンを追加でき、大量のコードをコピーする必要がなくなりました。
SO で多くの例を試しましたが、それらを実装しようとすると常につまずくようです。また、少し混乱して、さまざまな概念を混ぜようとします。Func を渡そうとしましたが、戻り値の型が必要なようで、メソッドが何も返さないため、デリゲートに移動しました。
私の例を変換するのを手伝ってくれる人はいますか?