如何在Entity Framework的TT模板中添加自定义ToString()方法
解决TT模板生成实体类自动重写ToString()的方案
一、模板中添加代码的位置
找到TT模板里负责生成类主体的方法,一般是名为WriteClass的方法(签名大概是<#+ void WriteClass(string namespaceName, CodeTypeDeclaration type) { #>),在这个方法里,等所有属性的生成代码写完之后、类的闭合大括号之前,插入ToString()方法的生成逻辑。
二、具体添加的模板代码
直接插入以下模板代码块,它会遍历当前类的所有属性,生成硬编码的ToString()实现:
public override string ToString() { return string.Join("; ", <# var properties = type.Members.OfType<CodePropertyDeclaration>().ToList(); for (int i = 0; i < properties.Count; i++) { var prop = properties[i]; Write($"nameof({prop.Name}) = {prop.Name}?.ToString() ?? string.Empty"); if (i != properties.Count - 1) { Write(", "); } } #> ); }
三、更优实现方案
有两种方向可选:
- 编译期硬编码(推荐):上面的模板生成方式已经很优,它在编译时就把属性名和取值逻辑写死,运行时没有额外开销,还能享受IDE的语法检查。
- 运行时反射(简洁但性能稍弱):如果追求模板代码更简洁,可以用反射实现,但运行时会有轻微性能损耗,适合非性能敏感场景:
public override string ToString() { return string.Join("; ", typeof(<#= type.Name #>).GetProperties() .Select(p => $"{p.Name} = {p.GetValue(this)?.ToString() ?? string.Empty}") ); }
内容的提问来源于stack exchange,提问作者Vya4slav
相关产品推荐
相关产品推荐

