T4模板:任何方法使ToStringWithCulture()将null转换为string.Empty而不是抛出异常?

时间:2015-05-14 15:43:44

标签: .net visual-studio-2013 t4

当我向具有可空属性的T4模板提供对象时,除非我明确写入<#= obj.Property ?? string.Empty #>,否则为模板生成的ToStringWithCulture(object objectToConvert)方法会抛出ArgumentNullException,如果属性为null 。是否有任何整洁或优雅的方式来覆盖这种行为,以便我不必在我的模板上使用胡椒空值合并?

2 个答案:

答案 0 :(得分:2)

劳埃德的答案基本上是正确的,但并不完整。您将不得不覆盖基本模板类,以使更改即使在您编辑模板后也能持久。方法如下:

  1. 为模板创建一个新的基类,例如TemplateBase.cs
  2. 将当前自动生成的模板基类的内容复制到TemplateBase.cs。自动生成的基类可以在Visual Studio中的.tt模板下找到。它称为YourTemplateBase,其中包含(除其他事项外)问题中提到的public class ToStringInstanceHelper

  3. 将以下声明添加到TemplateBase.cs

    /// <summary>
    /// Required to make this class a base class for T4 templates
    /// </summary>
    public abstract string TransformText();
    
  4. YourTemplate.tt中添加基本模板声明:

    <#@ template language="C#" Inherits="TemplateBase" #>
    

    更改之后,您的模板将不再生成基类。

  5. ToStringInstanceHelper中嵌套的TemplateBase.cs中进行以下编辑:

    public string ToStringWithCulture(object objectToConvert)
    {
        if (objectToConvert == null)
            return "";
        ...
    }
    

mnaoumov的信用额:https://mnaoumov.wordpress.com/2012/09/27/t4-runtime-templates-base-class/

答案 1 :(得分:1)

Mnaoumov的解决方案。更改base template class

public string ToStringWithCulture(object objectToConvert)
{
    if (objectToConvert == null)
        return "";
    ...
}