字串陣列解析小品集 (4) 外部實作法 (Extension Method)

從這一篇開始探討使用外部實作解析行為,採用 Extension Method。

談完兩種內部實作的方式,接著進入使用外部實作的方式來完成任務的作法,第一個要先展示的是使用 Extension Method 的做法。

Extension Method 外部實作有一個好處,我們可以完全保持資料型別的純淨度,尤其是 Entity Framework 自動產生 Data Model Class 的時候,通常我們會避免去修改資料型別的程式碼:但是又可以讓方法用起來像是該型別的成員方法。

第一個先列出完全乾淨的資料型別

    public class DataForTextFile1 
    {        
        public int Index { get; set; }

        public string English { get; set; }

        public string Chinese { get; set; }

    }

    public class DataForTextFile2 
    {    

        public int Index { get; set; }

        public string Person { get; set; }

        public DayOfWeek WeekDay { get; set; }

        public string Activity { get; set; }
    }

接著為這兩個型別撰寫 Extension Method,請注意這兩個方法的第一個帶有 this 宣告的參數型別。
 

  public static class Parser
    {
        public static void Parse(this DataForTextFile1 target, string[] items)
        {
            if (items == null)
            { throw new ArgumentNullException(); }
            if (items.Count() < 3)
            { throw new ArgumentException(); }
            target.Index = int.Parse(items[0]);
            target.English = items[1];
            target.Chinese = items[2];
        }

        public static void Parse(this DataForTextFile2 target, string[] items)
        {
            if (items == null)
            { throw new ArgumentNullException(); }
            if (items.Count() < 3)
            { throw new ArgumentException(); }           
            target.Index = int.Parse(items[0]);
            target.Person = items[1];
            target.WeekDay = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), items[2]);
            target.Activity = items[3];
        }
    }

程式碼的內容和上一篇基本上沒甚麼不同,只是從型別內部搬出來變成了 Extension Method 而已。最後還是要寫個 Console Application 來測試結果
 

  class Program
    {
        static void Main(string[] args)
        {
            ProcessTextFile1();
            Console.WriteLine();
            Console.WriteLine("**********************************");
            Console.WriteLine();
            ProcessTextFile2();
            Console.ReadLine();
        }

        static void ProcessTextFile1()
        {
            var lines = File.ReadAllLines("TextFile1.txt");
            List<DataForTextFile1> list = new List<DataForTextFile1>();
            foreach (var line in lines)
            {
                string[] items = line.Split(',');
                if (items != null)
                {
                    var obj = new DataForTextFile1();
                    obj.Parse(items);
                    list.Add(obj);
                }
            }

            // 顯示結果
            foreach (var item in list)
            {
                Console.WriteLine(item.Index.ToString());
                Console.WriteLine(item.English);
                Console.WriteLine(item.Chinese);
                Console.WriteLine("---------------------");
            }
        }
        static void ProcessTextFile2()
        {
            var lines = File.ReadAllLines("TextFile2.txt");
            List<DataForTextFile2> list = new List<DataForTextFile2>();
            foreach (var line in lines)
            {
                string[] items = line.Split(',');
                if (items != null)
                {
                    var obj = new DataForTextFile2();
                    obj.Parse(items);
                    list.Add(obj);
                }
            }

            // 顯示結果
            foreach (var item in list)
            {
                Console.WriteLine(item.Index.ToString());
                Console.WriteLine(item.Person);
                Console.WriteLine(item.WeekDay);
                Console.WriteLine(item.Activity);
                Console.WriteLine("---------------------");
            }
        }
    }