当我尝试从 <#+#> 括号中声明的非静态方法访问 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/