【发布时间】: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