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
技术改变世界
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决