【问题标题】:T4 templates: any way to make ToStringWithCulture() convert null to string.Empty instead of throwing exception?T4 模板:有什么方法可以让 ToStringWithCulture() 将 null 转换为 string.Empty 而不是抛出异常?
【发布时间】:2015-05-14 15:43:44
【问题描述】:
当我向具有可为空属性的 T4 模板提供对象时,除非我明确编写 <#= obj.Property ?? string.Empty #>,否则为模板生成的 ToStringWithCulture(object objectToConvert) 方法会在属性为空时抛出 ArgumentNullException。是否有任何简洁或优雅的方法来覆盖此行为,这样我就不必在我的模板中使用 null 合并?
【问题讨论】:
标签:
.net
visual-studio-2013
t4
【解决方案1】:
劳埃德的回答基本正确但不完整。即使在您编辑模板后,您也必须覆盖基模板类以使更改持续存在。方法如下:
- 为模板创建一个新的基类,例如
TemplateBase.cs
将当前自动生成的模板基类的内容复制到TemplateBase.cs。可以在 Visual Studio 中的 .tt 模板下找到自动生成的基类。它被称为YourTemplateBase,它包含(除其他外)问题中提到的public class ToStringInstanceHelper。
-
将以下声明添加到TemplateBase.cs:
/// <summary>
/// Required to make this class a base class for T4 templates
/// </summary>
public abstract string TransformText();
-
在YourTemplate.tt中添加基本模板声明:
<#@ template language="C#" Inherits="TemplateBase" #>
此更改后,您的模板将不再生成基类。
-
在嵌套在TemplateBase.cs 中的ToStringInstanceHelper 中进行以下编辑:
public string ToStringWithCulture(object objectToConvert)
{
if (objectToConvert == null)
return "";
...
}
感谢 mnaoumov:https://mnaoumov.wordpress.com/2012/09/27/t4-runtime-templates-base-class/
【解决方案2】:
Mnaoumov 的解决方案。更改base template class
public string ToStringWithCulture(object objectToConvert)
{
if (objectToConvert == null)
return "";
...
}