從這一篇開始探討使用外部實作解析行為,採用 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("---------------------");
}
}
}