【问题标题】:Visual Studio 2010 T4 Code Generation for Templated Types模板化类型的 Visual Studio 2010 T4 代码生成
【发布时间】:2013-04-26 07:58:36
【问题描述】:

我正在使用默认的 T4 模板来生成基于我的 UML 模型的代码。我有许多公开模板参数的类。这些按预期生成代码。例如MessageResponse 类公开了TMessageType 的参数。这会按预期生成代码:

public class MessageResponse<TMessageType>

{}

当我将此参数绑定到另一个类时,问题就出现了。例如,我创建了一个名为AccountMessageResponse 的类,它将模板参数绑定到一个类调用帐户。我期望看到的是如下生成的类:

public class AccountMessageResponse : MessageResponse<Account>

{}

但是,不会生成任何代码。当我查看代码生成的输出日志时,我看到了这条消息:

'RestModels::AccountMessageResponse' - (Class): no file generated because the 'AppliesToElement' method of the template 'ServiceClassTemplate.t4' evaluated to false.

当前默认模板不支持模板类型的代码生成吗?这是我需要自己做的事情,还是我做错了什么?

谢谢

【问题讨论】:

    标签: visual-studio-2012 code-generation t4 uml


    【解决方案1】:

    当您将模板类型与继承关系结合起来时,似乎会出现问题。这是一种解决方法。要获得所需的结果,您需要做的就是:

    1) 将模板参数 TMessageType 添加到您的类 RequestMessage。这将生成以下内容:

    public class RequestMessage<TMessageType>
    {}
    

    2) 创建一个名为 AccountRequestMessage 的类。

    3) 将 AccountRequestMessage 的 TemplateBinding 参数设置为“RequestMessage”。然后将 TemplateBinding 类设置为“Account”。然后,这将在您引用 AccountRequestMessage 的任何地方生成以下内容。例如,如果您有一个返回 AccountRequestMessage 的操作 Foo,则会生成以下代码:

    public RequestMessage<Account> Foo()
    {}
    

    4) 如果您需要生成一个实际的类,则需要添加一个继承自 AccountRequestMessage 的新类 AccountRequestMessageImpl。这将生成:

    public AccountRequestMessageImpl : RequestMessage<Account>
    {}
    

    这有点违反直觉,但比尝试修改 T4 模板更简单。

    尼克

    【讨论】:

      猜你喜欢
      • 2011-03-22
      • 1970-01-01
      • 2013-10-03
      • 2010-09-22
      • 1970-01-01
      • 2011-07-03
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多