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

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 Jessica
Hu Jessica
Jessica 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));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值