【问题标题】:How to set default namespace for T4 generated code如何为 T4 生成的代码设置默认命名空间
【发布时间】:2020-09-16 23:13:20
【问题描述】:

所以,我有 f T4 模板存储在文件夹 ProjectRoot/Data 中,每次我重建我的项目时,这个模板也会重建,所以 VS 自动将生成的类的命名空间设置为 ProjectName.Data,但我所有的其他类存储在命名空间 ProjectName 中,所以这会产生问题,因为我不想在每次重建项目或模板时更改此命名空间,特别是如果我将与其他人共享此项目,那么是否有任何功能可以设置命名空间在 T4 代码本身内部生成代码?

编辑

这是这个问题的最小再现示例:

文件 Output.tt,位于 ProjectRoot/Data

<#@ template language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="GLGenerator" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Linq" #>

// Some other code

<#+

    // Public constructor & class properties here

#>

然后基于这个 .tt 文件自动生成的类看起来像这样:

namespace <ProjectRoot>.Data
{
    using GLGenerator;
    using System.Text;
    using System.Collections.Generic;
    using System.Linq;
    using System;

    public partial class OutputEnums : OutputEnumsBase
    {
        public virtual string TransformText()
        {
            // Auto-generated template code
        }

        // Class properties & constructor    
    }
    // Other auto-generated code.        
}

如您所见,VS 自动将此类的命名空间设置为 ProjectName.Data,这对我来说很不利,因为我希望将我的所有类都放在一个命名空间中,以使它们中的大多数都在这个命名空间内部。那么,有没有办法将 VS 的这种行为改成别的呢?

【问题讨论】:

  • 为什么不将namespace MyNamespace { 添加到tt?
  • 它不会只是把这个文本放到结果字符串中吗?或者你的意思是别的什么,因为我想让那个自动生成的类被放置在某个命名空间中。
  • 看来我没明白你的问题。 t4 只是生成一个文本文件,它包含的内容完全在您的控制之下。
  • 是的,你是对的,但是在构建时 VS 从这个 T4 模板生成 C# 类,并且这个类对我来说存储在错误的命名空间中,所以我正在寻找一些方法来改变它默认命名空间到别的东西。
  • 能否提供一个具体的minimal reproducible example

标签: c# .net namespaces t4


【解决方案1】:

以下对我来说很好用:

<#@ template language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Linq" #>

namespace MyNamespace
{
    public partial class OutputEnums
    {
        public virtual string TransformText()
        {
            // Auto-generated template code
<#
#>
            return "";
        }

        // Class properties & constructor    
    }
    // Other auto-generated code.        
}

它产生 - 正如预期的那样 -

namespace MyNamespace
{
    public partial class OutputEnums
    {
        public virtual string TransformText()
        {
            // Auto-generated template code
            return "";
        }

        // Class properties & constructor    
    }
    // Other auto-generated code.        
}

【讨论】:

  • 您的 T4 文件看起来有点奇怪,在这种形式下,它只会生成 C# 脚本,将其内容简单地打印到结果字符串中,这不是我的意思。我的问题是,当我构建项目时,T4 也被构建,并且创建的类的命名空间不是我需要的,所以我正在寻找一些方法来改变这个 VS 行为或手动设置生成类的命名空间。
  • 那是因为我没有在之间写任何东西
  • 是的,但是我必须在 之间编写代码,然后是在此模板上生成的类,而不是文件,但类存储在错误的命名空间中。
  • 正如我在对您的问题的评论中所写:“如果我转换您的 tt,我不会得到您发布的结果”。如果没有可重复的示例,很难猜测您的真正问题是什么。
【解决方案2】:

在 cmets 中发生的混淆似乎是 @Klaus 假设使用一个简单的模板来直接生成 输出(一个类)。但问题是关于生成一个 intermediary 类(具有不需要的命名空间)的运行时模板,然后在运行时生成输出(另一个类)。

鉴于此理解,解决方案是右键单击.tt 文件,单击“属性”,然后选择“自定义工具命名空间”。

【讨论】:

    猜你喜欢
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多