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

简介: 我们在写一些Model的时候,经常会重写ToString,为了在控制台中进行打印或者更好的单元测试。 但是,如果Model的字段非常多的时候,如此简单的重复劳动经常会变成一件令人头痛的事情,因为大家 都不想重复劳动,或者这种事情应该交给初级程序员或者毕业生去做。

我们在写一些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

 

目录
相关文章
|
14天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
29 3
|
3月前
|
存储 API C#
【Azure Developer】解决Azure Key Vault管理Storage的示例代码在中国区Azure遇见的各种认证/授权问题 - C# Example Code
【Azure Developer】解决Azure Key Vault管理Storage的示例代码在中国区Azure遇见的各种认证/授权问题 - C# Example Code
|
5月前
|
机器学习/深度学习 开发框架 .NET
技术经验解读:【c#】反射真的很可怕吗?
技术经验解读:【c#】反射真的很可怕吗?
|
6月前
|
API C# 数据库
C#反射详解
C#反射详解
61 0
|
6月前
|
SQL 开发框架 .NET
C# Linq SaveChanges()报错 You have an error in your SQL syntex
C# Linq SaveChanges()报错 You have an error in your SQL syntex
29 0
|
6月前
|
设计模式 C#
C#反射机制实现开闭原则的简单工厂模式
C#反射机制实现开闭原则的简单工厂模式
54 0
|
6月前
|
存储 C# 开发者
C# | 通过反射将对象属性展示在TreeView中
在编程过程中,我们经常需要处理复杂的对象和数据结构。将这些数据结构展示在UI界面上是很有用的,可以帮助开发者更好地理解和分析数据。 而TreeView作为一种常见的控件,可以以树状结构的方式展示数据,非常适合用于展示层次化的对象。 本文将介绍如何使用TreeView控件展示一个对象,并且可以动态处理对象中的属性和子对象。通过本文的学习,您将学会如何更好地理解和展示数据,提高编程效率。
74 0
C# | 通过反射将对象属性展示在TreeView中
|
存储 Java API
C#反射(Reflection)详解
反射是.NET中的重要机制,通过反射可以得到*.exe或*.dll等程序集内部的接口、类、方法、字段、属性、特性等信息,还可以动态创建出类型实例并执行其中的方法。反射指程序可以访问、检测和修改它本身状态或行为的一种能力。通俗一点:我们在获取其他实体类的字段名或实列,只能获取公有的,而有了反射之后可以获取私有的,可以获取他的基类等等,可以说把家底查得清清楚楚。
234 1
|
11月前
|
C#
C# “数据“ToString的格式转换 进制转换 时间转换
C# “数据“ToString的格式转换 进制转换 时间转换
|
11月前
|
安全 C# 图形学
C#的反射机制
C#的反射机制