C# 為型別輸出格式化字串
阿新 • • 發佈:2020-06-21
有兩種方法可以為型別提供格式化字串輸出:
1、讓型別繼承IFormattable介面,實現IFormattable介面的ToString方法,需要開發者可以預見型別在格式化方面的要求。
呼叫輸出未重寫Tostring方法:
1 Person person = new Person 2 { 3 ID = "NO1",4 FirstName = "You",5 LastName = "Xu" 6 }; 7 Console.WriteLine(person);
輸出的是型別名稱:
改善1.Person
為Person類實現IFormattable介面,重寫ToString方法:
1 class Person : IFormattable 2 { 3 public string ID { get; set; } 4 public string FirstName { get; set; } 5 public string LastName { get; set; } 6 7 //實現IFormattable介面的ToString方法 8 public string ToString(string format,IFormatProvider formatProvider)9 { 10 switch (format) 11 { 12 case "Ch": 13 return this.ToString(); 14 case "Eg": 15 return string.Format("{0} {1}",FirstName,LastName); 16 default: 17 return this.ToString(); 18 } 19 } 20 21 //重寫Object.ToString() 22 public override string ToString() 23 { 24 return string.Format("{0} {1}",LastName,FirstName); 25 } 26 }
呼叫輸出修改後的程式碼:
1 Person person = new Person 2 { 3 ID = "NO1",4 FirstName = "You",5 LastName = "Xu" 6 }; 7 Console.WriteLine(person); 8 Console.WriteLine(person.ToString("Ch",null)); 9 Console.WriteLine(person.ToString("Eg",null));
輸出結果:
Xu You
Xu You
You Xu
2、為型別自定義格式化器,可以根據需求的變化提供多個格式化器,隨時增加或者修改它。
class Person { public string ID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } //Person類的格式化器 class PersonFormatter : IFormatProvider,ICustomFormatter { //實現IFprmatProvider介面 public object GetFormat(Type formatType) { if (formatType == typeof(ICustomFormatter)) { return true; } else { return false; } } //實現ICustomFormatter介面 public string Format(string format,object arg,IFormatProvider formatProvider) { Person person = arg as Person; if (person == null) { return string.Empty; } switch (format) { case "Ch": return string.Format("{0} {1}",person.LastName,person.FirstName); case "Eg": return string.Format("{0} {1}",person.FirstName,person.LastName); case "ChM": return string.Format("{0} {1}:{2}",person.ID); default: return string.Format("{0} {1}",person.FirstName); } } }
呼叫格式化器程式碼:
1 Person person = new Person 2 { 3 ID = "NO1", 4 FirstName = "You", 5 LastName = "Xu" 6 }; 7 Console.WriteLine(person); 8 9 PersonFormatter pFormatter = new PersonFormatter(); 10 11 Console.WriteLine(pFormatter.Format("Ch",person,null)); 12 Console.WriteLine(pFormatter.Format("Eg",null)); 13 Console.WriteLine(pFormatter.Format("ChM",null));
輸出結果,因為沒有重寫Object.ToString方法,型別會輸出型別名稱:
改善1.Person
Xu You
You Xu
Xu You:NO1
在對IFormattable介面的ToString方法實現時,可以結合格式化器,讓格式化輸出在語法上支援更多的呼叫方式,修改ToString方法裡switch結構的default部分:
1 class Person : IFormattable 2 { 3 public string ID { get; set; } 4 public string FirstName { get; set; } 5 public string LastName { get; set; } 6 7 //實現IFormattable介面的ToString方法 8 public string ToString(string format,LastName); 16 default: 17 ICustomFormatter customFormatter = formatProvider as ICustomFormatter; 18 if (customFormatter == null) 19 { 20 return this.ToString(); 21 } 22 return customFormatter.Format(format,this,null); 23 } 24 } 25 26 //重寫Object.ToString() 27 public override string ToString() 28 { 29 return string.Format("{0} {1}",FirstName); 30 } 31 }
呼叫程式碼:
1 Person person = new Person() 2 { 3 ID = "NO1", 4 FirstName = "You", 5 LastName = "Xu" 6 }; 7 Console.WriteLine(person); 8 9 PersonFormatter pFormatter = new PersonFormatter(); 10 11 Console.WriteLine(pFormatter.Format("Ch",null)); 12 Console.WriteLine(pFormatter.Format("Eg",null)); 13 Console.WriteLine(pFormatter.Format("ChM",null)); 14 15 Console.WriteLine(person.ToString("Ch",pFormatter)); 16 Console.WriteLine(person.ToString("Eg",pFormatter)); 17 Console.WriteLine(person.ToString("ChM",pFormatter));
參考:《編寫高質量程式碼改善C#程式的157個建議》陸敏技