【问题标题】:C# Using T4 to generate enumsC# 使用 T4 生成枚举
【发布时间】:2011-03-13 06:54:41
【问题描述】:

在我的项目中,我想使用 T4 来生成我的枚举。为了测试这一点,我用一个简单的表单创建了一个测试项目。在这个项目中,我添加了一个 .tt 文件并将我的代码放入该文件中。

一切正常,但我有点失望。我认为当项目执行时,T4 会生成枚举。所以枚举总是最新的。但事实并非如此,对吧?如果您希望更新枚举,您必须手动执行此操作并重新构建您的解决方案。我的问题是,我在这个中正确吗?还是我错过了什么。

其次,为什么要使用 T4 创建枚举?我的意思是如果枚举发生变化,我必须重建我的解决方案。

编辑: 我从数据库表中获取我的枚举值。该表只有 2 个字段:Id 和 Description

【问题讨论】:

  • "为什么要使用 T4 创建枚举?"这是一个很好的问题。您从哪里获得要生成的枚举值?
  • 我从数据库中获取我的枚举值(我已经编辑了我的 startpost)
  • 那么除了它只在您重建解决方案时更新之外,它还能如何工作其他? T4 模板如何“知道”您的数据库已更改并因此需要更新?
  • 我在想如果每个启动都生成 Enum 会更强大。这样,解决方案就不需要重建,并且枚举始终是最新的。但是如果这不可能,那为什么要使用 T4 来生成枚举呢?

标签: c# t4


【解决方案1】:

说实话,我不认为值得付出努力。您仍然必须返回并更新您的代码以处理任何新值。你能做的最好的事情是确保你的 switch 语句有一个默认情况。

switch (enumValue)
{
    // ...
    default:
        throw new InvalidOperationException(
            "The enum value " + enumValue + " is unhandled."
        );
}

【讨论】:

  • 这更像是一种解决方法,但感谢您的努力:)
  • @Martijn - 不是一个解决方法,更像是建议。我的观点是,使用模板重新生成枚举确实不会为您节省太多时间。您需要在使用枚举的每个地方手动处理新值。
【解决方案2】:

您的表不是实际的 enum 等效项

如果您的表更改了它的值,那么现在成为enum 并不是一个很好的竞争者,是吗? C# 枚举往往是静态定义的,除非有原因,否则不会更改。当他们这样做时,代码必须适应这种变化才能使用额外的值。

因此,如果您的应用程序能够更改表格的内容,那么这只是一个普通的表格。

但是,如果您想要一个通用的 T4 模板,它实际上会生成带有 XML 文档的枚举,而我已经付出了一些努力来编写这样的模板。 this blog post 中记录了所有内容。包括模板的代码。

【讨论】:

  • 查找表应该是静态的,但您可能需要添加或删除条目。在我看来,这在 IT 中是完全合理甚至可以预期的。所以是的,转换为枚举的源数据不应该是定期更改的东西,但假设源不会更改几乎是不切实际的。
  • 顺便说一句,就在今天,经过一番谷歌搜索,我最终进入了 [你的博客] (erraticdev.blogspot.co.il),非常好的标题/介绍 :-)
【解决方案3】:

这是一篇关于往另一个方向发展的文章(从 SQL 视图生成 c# 枚举)

http://www.olegsych.com/2008/07/t4-template-for-generating-sql-view-from-csharp-enumeration/

【讨论】:

    【解决方案4】:

    PLINQO 能够很容易地从一个表中生成枚举,但您会被 LINQ-TO-SQL 卡住。如果您只需要生成的枚举就足够了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 2023-02-07
      相关资源
      最近更新 更多