从T4类访问Host对象

时间:2012-04-29 16:24:57

标签: c# visual-studio-2010 t4 host-object

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

<#+
public class ProjectTraverser
{
    public void Traverse()
    {
        var a = Host;
    }
}
#>

执行此模板时出现以下错误:“编译转换:无法通过嵌套类型'Microsoft.VisualStudio.TextTemplating7D03DF372FEAC3D3A28C011A41F02403.GeneratedTextTransformation访问外部类型的非静态成员'Microsoft.VisualStudio.TextTemplating7D03DF372FEAC3D3A28C011A41F02403.GeneratedTextTransformation' .ProjectTraverser'd:\ Projects \ Test Solutions \ GettingStarted \ TelerikMvc3RazorApplication \ TextTemplate2.tt“

请分享任何想法。

1 个答案:

答案 0 :(得分:5)

正如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; 
    } 
} 
#>