C# Meta Programming - Let Your Code Generate Code - 利用反射重写自动的ToString()

我们在写一些Model的时候,经常会重写ToString,为了在控制台中进行打印或者更好的单元测试。

但是,如果Model的字段非常多的时候,如此简单的重复劳动经常会变成一件令人头痛的事情,因为大家

都不想重复劳动,或者这种事情应该交给初级程序员或者毕业生去做。

看如下:

public class Customer
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }

    public override string ToString()
    {
        string format = "First Name: {0}\nLast Name: {1}\nAge: {2}\n";

        return string.Format(format, FirstName, LastName, Age);        
    }
}

 

如果充分利用反射的特性,我们可以做一个扩展方法,请看如下:

public static class ObjectExtensions
{
    public static string ToStringReflection<T>(this T @this)
    {
        var query = from prop in @this.GetType().GetProperties(
                    BindingFlags.Instance | BindingFlags.Public)
                    where prop.CanRead
                    select string.Format("{0}: {1}\n",
                    prop.Name,
                    prop.GetValue(@this, null));

        string[] fields = query.ToArray();
        StringBuilder format = new StringBuilder();

        foreach (string field in fields)
        {
            format.Append(field);
        }

        return format.ToString();
    }
}


这样,我们在原来的代码中只要写一句话:

namespace Zeus.Thunder.Test.Model
{
    public class Customer
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
        public override string ToString()
        {
            return this.ToStringReflection();
        }
    }
}


测试程序:

Customer customer = new Customer()
{
    FirstName = "Master",
    LastName = "HaKu",
    Age = 20
};

Console.WriteLine(customer.ToString());

 

运行结果如下:

FirstName: Master
LastName: HaKu
Age: 20

 

posted @ 2014-09-28 11:35  Master HaKu  阅读(1429)  评论(1编辑  收藏  举报