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 =
}; Console.WriteLine(customer.ToString());
运行结果如下:
FirstName: Master
LastName: HaKu
Age: 20
C# Meta Programming - Let Your Code Generate Code - 利用反射重写自动的ToString()的更多相关文章
- C# Meta Programming - Let Your Code Generate Code - Introduction of The Text Template Transformation Toolkit(T4)
<#@ template language="C#" #> <#@ output extension=".cs" #> <#@ a ...
- 问题:Custom tool error: Failed to generate code for the service reference 'AppVot;结果:添加Service Reference, 无法为服务生成代码错误的解决办法
添加Service Reference, 无法为服务生成代码错误的解决办法 我的解决方案是Silverlight+WCF的应用,Done Cretiria定义了需要在做完Service端的代码后首先运 ...
- Python 与 meta programming
meta programming: 编写能改变语言语法特性或者运行时特性的程序 Meta- 这个前缀在希腊语中的本意是「在…后,越过…的」,类似于拉丁语的 post-,比如 metaphysics 就 ...
- Fortify漏洞之Dynamic Code Evaluation: Code Injection(动态脚本注入)和 Password Management: Hardcoded Password(密码硬编码)
继续对Fortify的漏洞进行总结,本篇主要针对 Dynamic Code Evaluation: Code Injection(动态脚本注入) 和 Password Management: Har ...
- 解决 VS Code「Code Runner」插件运行 python 时的中文乱码问题
描述 这里整理了两种 VS Code「Code Runner」插件运行 python 时乱码的解决方案.至于设置「Auto Guess Encoding」为 true 的操作这里就不多描述了. 乱码截 ...
- 在vue中获取微信支付code及code被占用问题的解决?
这个地方坑比较多,查看网上并没有详细的文档,新手一般写到这里很痛苦.这里我只介绍一下我解决的方案,虽然它不是最好的,但是可行的方案: 总体分两步 1)跳到微信支付链接,它会自动拼接上code 2)获取 ...
- Fortify Audit Workbench 笔记 Dynamic Code Evaluation: Code Injection
Dynamic Code Evaluation: Code Injection Abstract 在运行时中解析用户控制的指令,会让攻击者有机会执行恶意代码. Explanation 许多现代编程语言 ...
- jQuery选择器中,通配符[id^='code']input[id$='code'][id*='code']
1.选择器 (1)通配符: $("input[id^='code']");//id属性以code开始的所有input标签 $("input[id$='code']&qu ...
- Meta Programming
[本文链接] http://www.cnblogs.com/hellogiser/p/meta-programming.html [分析] Template Mataprogram,中文叫模板元编程. ...
随机推荐
- 初始pip
关于pip包括下面的东西还不是很懂,慢慢的了解,我的pip是从https://bootstrap.pypa.io/get-pip.py 粘贴并命名为 get-pip.py 后,执行 python ge ...
- POJ1958 Strange Towers of Hanoi [递推]
题目传送门 Strange Towers of Hanoi Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3117 Ac ...
- vue中回到顶部
1. 回到顶部,使用 scrollIntoView 方法: Element.scrollIntoView方法滚动当前元素,进入浏览器的可见区域 该方法可以接受一个布尔值作为参数.如果为true,表示元 ...
- 26、Flask实战第26天:cms用户模型定义
编辑cms.models.py from exts import db from datetime import datetime class CMSUser(db.Model): __tablena ...
- 【POJ 2409】Let it Bead
http://poj.org/problem?id=2409 Burnside引理:设\(G\)是\(X\)的置换群,而\(\mathcal{C}\)是\(X\)中一个满足下面条件的着色集合:对于\( ...
- Bomb Enemy -- LeetCode
Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number zero), return ...
- [LOJ2541]猎人杀
好题== 先转化一下,每个人被杀死后给他打标记,以后随机杀人时选到有标记的人就继续随机,这样并不会改变每个人被杀死的概率 直接算很难算,考虑容斥,我们枚举$S$表示在$1$死后才死的人至少在集合$S$ ...
- 【树形dp】hdu6035 Colorful Tree
非常棒的题解,我就不复述了:http://blog.csdn.net/Bahuia/article/details/76141574 O(n) #include<cstdio> #incl ...
- 零起点学算法08——简单的输入和计算(a+b)
#include <stdio.h> int main() { int a; int b; scanf("%d %d",&a,&b); printf(& ...
- Linux使用pyVLfeat库做Dense sift提示段错误(segmentation fault)详细分析
pyVLfeat是著名的图像处理库VLFeat在python上的接口包.在linux环境下使用该库提示“段错误”.百度后得知: 所谓的段错误就是指访问的内存超出了系统所给这个程序的内存空间 意思其实就 ...