【问题标题】:T4 reference a const in a static class at compile timeT4 在编译时引用静态类中的 const
【发布时间】:2013-06-15 13:08:12
【问题描述】:

我有一个 T4 C# 文件,我需要在其中引用静态类中的常量。静态类在同一个命名空间中。

这可能吗?

以下仅为说明。我需要根据现有常量计算实际常量,但也需要调用涉及的扩展方法。为了简单起见,我只是在说明这个概念。

.cs 文件:

namespace me
{
  public static class Stat
  {
    public const int Const = 1;
  }
}

。 tt 文件:

...
namespace me
{
  public static int Test
  {
    return <#= Stat.Const #>;
  }
}

【问题讨论】:

  • 这是个好问题。这是一个普遍的问题,答案并不明显。我想我可能会写一篇关于它的博客文章;)。
  • 完成后请链接到您的帖子,以便我可以详细查看答案。
  • 其他一些想法。 const 可以由 TT 文件“拥有”并作为生成过程的一部分输出。或者尝试 roslyn 解析包含 const 的文件并从语法树中提取出来。

标签: c# visual-studio-2012 t4


【解决方案1】:

确实有可能。但是,您需要先做几件事:

  1. 确保您的 class 和 const 都是公共的(它们是公共的)。
  2. 构建您的解决方案以生成一个 dll(其中将包含您要引用的静态类和 const)。
  3. 使用&lt;#@ assembly name="$(TargetPath)" #&gt; 在您的.tt 中引用当前程序集
  4. 使用&lt;#@ import namespace="ns" #&gt; 引用您的静态类所在的命名空间
  5. 生成您的 .tt.
  6. 重建您的解决方案以在程序集中包含新生成的代码。

应该这样做。棘手的一点是要意识到您的 .tt 不像项目中的任何旧类文件那样工作。因为它是生成的,所以它需要生成一些东西,在这种情况下,它是你必须事先生成的项目 dll。


正如承诺的那样,here is the blog post I wrote about this question :)

【讨论】:

  • 这是否意味着常量必须在不同的程序集中才能被引用?
  • 否,但您必须再次重新生成 .dll 以包含从 .tt 生成的代码。如果您生成的代码文件中存在构建错误,那么您必须在重新生成之前擦除其内容。
猜你喜欢
  • 2019-02-09
  • 2019-05-03
  • 2011-02-07
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 2014-04-27
  • 2013-02-16
  • 1970-01-01
相关资源
最近更新 更多