从 T4 类访问主机对象

本文关键字:主机 对象 访问 T4 | 更新日期: 2023-09-27 18:32:43

当我尝试从括号<#+#>括号中声明的非静态方法访问 Host 对象时,一切正常。但是我需要从类方法访问它,如下所示:

<#+
public class ProjectTraverser
{
    public void Traverse()
    {
        var a = Host;
    }
}
#>
执行此模板时出现以下错误:"编译转换:无法访问外部类型'Microsoft.VisualStudio.TextTemplating7D03DF372FEAC3D3A28C011A41F02403.Generated

TextTransformation'的非静态成员通过嵌套类型'Microsoft.VisualStudio.TextTemplating7D03DF372FEAC3D3A28C011A41F02403.Generated TextTransformation.ProjectTraverser' d:''Projects''Test Solutions''GettingStarted''TelerikMvc3RazorApplication''TextTemplate2.tt"

请分享任何想法。

从 T4 类访问主机对象

正如 FuleSnabel 所评论的那样,您所做的声明是针对嵌套类型的,该嵌套类型无法访问表示模板的封闭类型中的实例变量。

您要做的是将 ITextTemplatingEngineHost 类型的 Host 属性添加到 ProjectTraverser 类(可能是静态的),然后从主模板设置它。

回想起来,我希望我已将主 Host 属性设置为静态,因为想象同一 AppDomain 中同一模板的不同实例的多个主机并不明智,但您可以生活和学习。

下面是一个粗略的示例:

<#@ template hostspecific="true' #>
<#
    ProjectTraverser.Host = Host;
#>
<#+ 
public class ProjectTraverser 
{
    public static ITextTemplatingEngineHost Host { get; set; }
    public void Traverse() 
    { 
        var a = Host; 
    } 
} 
#>