c# - 从 T4 类访问主机对象

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

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

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

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

请分享任何想法。

最佳答案

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

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

回想起来,我希望我将主 Host 属性设为静态,因为想象多个主机用于同一 AppDomain 中同一模板的不同实例并不是很明智,但你会生活和学习。

这是一个粗略的例子:

<#@ template hostspecific="true' #>
<#
    ProjectTraverser.Host = Host;
#>
<#+ 
public class ProjectTraverser 
{
    public static ITextTemplatingEngineHost Host { get; set; }

    public void Traverse() 
    { 
        var a = Host; 
    } 
} 
#> 

关于c# - 从 T4 类访问主机对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10373766/

相关文章:

asp.net-mvc - 如何使用 1 个解决方案实现对 2 个网站的支持

c# - 界面无法更新

c# - 在 VS2010 Pro 中重构点命名空间?

visual-studio-2010 - 从自定义基类继承 T4 模板,提供未安装 Visual Studio 2010 SDK

c# - 事件成员使用什么 EnvDTE 接口(interface)?

c# - 这是冗余代码吗?

c# - 使用 FOR 循环,如何显示数组中的前 3 个值?

c# - 用数组初始化列表

c# - C# 中的 FTP 返回损坏的文件,为什么?

c# - T4 预处理模板调试不起作用 - Visual Studio 2010 RTM