创建自定义 T4 文本模板指令处理器

文本模板转换过程采用文本模板文件作为输入,并生成文本文件作为输出。 文本模板转换引擎控制该过程,引擎与文本模板转换主机和一个或多个文本模板指令处理器交互以完成该过程。 有关详细信息,请参阅 文本模板转换过程

若要创建自定义指令处理器,请创建一个类,该类继承自 DirectiveProcessorRequiresProvidesDirectiveProcessor

这两者之间的差异是 DirectiveProcessor 实现从用户获取参数所需的最小接口,并生成生成模板输出文件的代码。 RequiresProvidesDirectiveProcessor 实现要求/提供设计模式。 RequiresProvidesDirectiveProcessor 处理两个特殊参数, requires 以及 provides。 例如,自定义指令处理器可能接受来自用户的文件名,打开并读取文件,然后将文件的文本存储在一 fileText个名为的变量中。 子类 RequiresProvidesDirectiveProcessor 可能会从用户那里获取一个文件名,并将其用作参数 requires 的值,同时将要存储文本的变量名称用作参数 provides 的值。 此处理器将打开并读取文件,然后将文件的文本存储在指定的变量中。

在 Visual Studio 中从文本模板调用自定义指令处理器之前,必须注册它。

有关如何添加注册表项的详细信息,请参阅 部署自定义指令处理器

自定义指令

自定义指令如下所示:

<#@ MyDirective Processor="MyDirectiveProcessor" parameter1="value1" ... #>

如果要从文本模板访问外部数据或资源,可以使用自定义指令处理器。

不同的文本模板可以共享单个指令处理器提供的功能,因此指令处理器提供了一种方法来考虑代码以供重复使用。 内置 include 指令类似,因为你可以使用它来分解代码并在不同的文本模板之间共享它。 区别在于,指令提供的任何功能 include 都是固定的,不接受参数。 如果要为文本模板提供通用功能并允许模板传递参数,则必须创建自定义指令处理器。

自定义指令处理器的一些示例可以是:

  • 一个指令处理器,用于从接受用户名和密码作为参数的数据库返回数据。

  • 一个指令处理器,用于打开并读取接受文件名称作为参数的文件。

自定义指令处理器的主要部分

若要开发指令处理器,必须创建继承自 DirectiveProcessorRequiresProvidesDirectiveProcessor 的类。

必须实现的最重要 DirectiveProcessor 方法如下所示。

  • bool IsDirectiveSupported(string directiveName) - 如果指令处理器可以处理命名指令,则返回 true

  • void ProcessDirective (string directiveName, IDictionary<string, string> arguments) - 模板引擎在模板中每次遇到指令时调用此方法。 处理器应保存结果。

在对 ProcessDirective() 的所有调用之后,模板化引擎将调用以下方法:

  • string[] GetReferencesForProcessingRun() - 返回模板代码所需的程序集的名称。

  • string[] GetImportsForProcessingRun() - 返回可在模板代码中使用的命名空间。

  • string GetClassCodeForProcessingRun() - 返回模板代码可以使用的方法、属性和其他声明的代码。 执行此作的最简单方法是生成包含 C# 或 Visual Basic 代码的字符串。 若要使指令处理器能够从使用任何 CLR 语言的模板调用,可以将语句构造为 CodeDom 树,然后返回以模板使用的语言序列化树的结果。

  • 有关详细信息,请参阅 演练:创建自定义指令处理器