Tip13 为类型输出格式化字符串

来源:互联网 发布:unity3d增强现实插件 编辑:程序博客网 时间:2024/06/05 13:41

Tip13 为类型输出格式化字符串
有两种方法为类型提供格式化的字符串输出:
1、让类型继承接口IFormattable。(需要预见类型在格式化方面的需求)
2、让类型继承接口IFormatProvider和ICustomFormatter,为类型自定义格式化器。

方法1的例子:

    class Person : IFormattable    {        public string IDCode { get; set; }        public string FirstName { get; set; }        public string LastName { get; set; }        public string ToString(string format, IFormatProvider formatProvider)        {            switch (format)            {                case "Ch":                    return this.ToString();                case "Eg":                    return string.Format("{0} {1}", FirstName, LastName);                default:                    return this.ToString();            }        }        public override string ToString()        {            return string.Format("{0} {1}", LastName, FirstName);        }    }
Person person = new Person() { FirstName = "Jessica", LastName = "Hu", IDCode = "NB123" };Console.WriteLine(person);Console.WriteLine(person.ToString("Ch", null));Console.WriteLine(person.ToString("Eg", null));//输出如下:Hu JessicaHu JessicaJessica Hu

方法2的例子:

    class Person    {        public string IDCode { get; set; }        public string FirstName { get; set; }        public string LastName { get; set; }    }    class PersonFormatter : IFormatProvider, ICustomFormatter    {        public object GetFormat(Type formatType)        {            if (formatType == typeof(ICustomFormatter))            {                return this;            }            else            {                return null;            }        }        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}", person.LastName, person.FirstName, person.IDCode);                default:                    return string.Format("{0} {1}", person.FirstName, person.LastName);            }        }
            Person person = new Person() { FirstName = "Jessica", LastName = "Hu", IDCode = "NB123" };            Console.WriteLine(person.ToString());            PersonFormatter pFormatter = new PersonFormatter();            Console.WriteLine(pFormatter.Format("Ch", person,null));            Console.WriteLine(pFormatter.Format("Eg", person, null));            Console.WriteLine(pFormatter.Format("ChM",person,null));            //输出:            ConsoleApplication1.Person            Hu Jessica            Jessica Hu            Hu Jessica

其实可以在方法1的ToString方法稍作修改,让格式化输出在语法上支持更多的调用方式:

    class Person : IFormattable    {        public string IDCode { get; set; }        public string FirstName { get; set; }        public string LastName { get; set; }        //实现接口IFormattable的方法ToString        public string ToString(string format, IFormatProvider formatProvider)        {            switch (format)            {                case "Ch":                    return this.ToString();                case "Eg":                    return string.Format("{0} {1}", FirstName, LastName);                default:                    //return this.ToString();                    ICustomFormatter customFormatter = formatProvider as ICustomFormatter;                    if (customFormatter == null)                    {                        return this.ToString();                    }                    return customFormatter.Format(format, this, null);            }        }        //重写Object.ToString()        public override string ToString()        {            return string.Format("{0} {1}", LastName, FirstName);        }    }

调用如下:

            Person person = new Person() { FirstName = "Jessica", LastName = "Hu", IDCode = "NB123" };            Console.WriteLine(person.ToString());            PersonFomatter pFormatter = new PersonFomatter();            //第一类格式化输出语法            Console.WriteLine(pFormatter.Format("Ch", person, null));            Console.WriteLine(pFormatter.Format("Eg", person, null));            Console.WriteLine(pFormatter.Format("ChM", person, null));            //第二类格式化输出语法,也更简洁            Console.WriteLine(person.ToString("Ch", pFormatter));            Console.WriteLine(person.ToString("Eg", pFormatter));            Console.WriteLine(person.ToString("ChM", pFormatter));
原创粉丝点击