先前上課時,講到委派,一知半解,工作後也嫌少使用到需要用委派的時機 (因為不會用),註記一下使用的方法以便後續需要用到的時後仍要查一次
委派的觀念和介面操作有87啪像,主要都是讓實作與宣告分開可參考 https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms173173(v=vs.80).aspx
首先需要一個範例(需求):判斷文件類型並針對該類型的文件進行解析 ex:副檔名為.doc 則使用 word的套件、副檔加為.pdf 則使用 對應的三方套件....等
//這一行是定義一個委派的方法,其參數與回傳值必須於被委派的方法相同,就當做是公式背起來吧!
private delegate string extractFile(string filepath);
private void button9_Click(object sender, EventArgs e)
{
var msg = "";
var msg1 = "";
var msg2 = "";
var msg3 = "";
var msg4 = "";
//取得某資料夾下的檔案並判斷其副檔名
var strfile = System.IO.Directory.GetFiles("D:\\WaitForExtract");
for (var i = 0; i <= strfile.Count() - 1; i++)
{
//取得副檔名
var ext = System.IO.Path.GetExtension(strfile[i]);
//一般我們會這樣使用
if (ext == ".doc") msg = extractWord(strfile[i]);
if (ext == ".pdf") msg = extractPdf(strfile[i]);
if (ext == ".msg") msg = extractmsg(strfile[i]);
//宣告委派
extractFile exf = null;
//使用委派,用法1 (此用法就如同介面用法)
//C# 2.0 的寫法
if (ext == ".doc") exf = extractWord;
if (ext == ".pdf") exf = extractPdf;
if (ext == ".msg") exf = extractmsg;
msg1 = exf(strfile[i]) + Environment.NewLine;
//C# 3.0 的寫法 (匿名方法使用 2.0 就有,以下更簡短)
if (ext == ".doc") exf = (string s) => { return "WordContent"; };
if (ext == ".pdf") exf = (string s) => { return "PdfContent"; };
if (ext == ".msg") exf = (string s) => { return "msgContent"; };
msg2 = exf("此傳入值,會直接對應上面的匿名方法可在上面註冊的方法中使用");
//例如 if (ext == ".msg") exf = (string s) => { return s; };
//使用委派,用法2 (將方法當參數傳遞,透過此方法封裝判斷邏輯)
exf = null;
msg3 = extractContent(strfile[i], exf);
//使用委派,用法3 (一次執行多個方法:此委派每個方法都會執行,只是最後一個執行的是.msg的方法)
exf = null;
exf = extractWord;
exf += extractPdf;
exf += extractmsg;
msg4 = exf(strfile[i]);
//將結果列印出
textBox1.Text += msg + Environment.NewLine;
textBox1.Text += msg1 + Environment.NewLine;
textBox1.Text += msg2 + Environment.NewLine;
textBox1.Text += msg3 + Environment.NewLine;
textBox1.Text += msg4 + Environment.NewLine;
}
}
private string extractContent(string path, extractFile exf)
{
var ext = System.IO.Path.GetExtension(path);
if (ext == ".doc") exf = extractWord;
if (ext == ".pdf") exf = extractPdf;
if (ext == ".msg") exf = extractmsg;
return exf(path);
}
private string extractWord(string filepath)
{
return "WordContent";
}
private string extractPdf(string filepath)
{
return "PdfContent";
}
private string extractmsg(string filepath)
{
return "msgContent";
}
以上是列出目前我有使用到的一些委派用法,使用的情境很多,還有很多用法沒有使用到,後續如有其他運用於實務上的會在補足。