1. 程式人生 > WINDOWS開發 >C# 為型別輸出格式化字串

C# 為型別輸出格式化字串

有兩種方法可以為型別提供格式化字串輸出:

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個建議》陸敏技