委派用法記錄

  • 117
  • 0

先前上課時,講到委派,一知半解,工作後也嫌少使用到需要用委派的時機 (因為不會用),註記一下使用的方法以便後續需要用到的時後仍要查一次

委派的觀念和介面操作有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";
        }

以上是列出目前我有使用到的一些委派用法,使用的情境很多,還有很多用法沒有使用到,後續如有其他運用於實務上的會在補足。