T4命名空间和类型解析

mar*_*are 4 c# asp.net-mvc t4 resources

我正在尝试创建T4模板,它将获取我的应用程序全局资源,循环遍历静态属性并创建具有const string属性的静态类,因此我将能够string通过使用强类型获取资源名称.

这就是我现在拥有的:

<#@ template debug="true" hostSpecific="true" #>
<#@ include file="EF.Utility.CS.ttinclude"#>
<#@ output extension=".cs"#>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #>
<#  CodeGenerationTools code = new CodeGenerationTools(this);
    MetadataLoader loader = new MetadataLoader(this);
    CodeRegion region = new CodeRegion(this, 1);
    MetadataTools ef = new MetadataTools(this);
    string namespaceName = code.VsNamespaceSuggestion();
if (!String.IsNullOrEmpty(namespaceName))
{ #>
namespace <#=code.EscapeNamespace(namespaceName)#>
{
<#    PushIndent(CodeRegion.GetIndent(1));
} #>
    public static class ResourceStrings {
<#      var props = typeof(Resources).GetProperties(BindingFlags.Static);
        foreach (var prop in props) { #>
            public const string <#= prop.Name #> = "<#= prop.Name #>";
<#      } #>
    }
<# if (!String.IsNullOrEmpty(namespaceName))
{
    PopIndent(); #>
}
<# } #>
<#+
  // Insert any template procedures here
#>
Run Code Online (Sandbox Code Playgroud)

问题是它只是找不到Resources命名空间typeof().该Resources命名空间是我Localize.designer.cs文件(自动生成Localize.resx的文件)的命名空间.

我在这里错过了什么?

Jür*_*ock 5

我刚才有类似的想法.我想为我的用户设置创建一个带有const字符串值的静态类,以便在Windows窗体绑定中使用强类型而不是字符串:

this.textBox1.DataBindings.Add("Text", Properties.Settings.Default, Properties.Settings.PropertyNames.SomeStringValue);
Run Code Online (Sandbox Code Playgroud)

但是,我发现t4模板无法访问当前项目的类型.你必须加载文件

<#@ assembly name="$(TargetPath)" #>
Run Code Online (Sandbox Code Playgroud)

但是,如果您这样做并重新生成模板,则不会重建项目,因为文件正在使用中,除非您关闭visual studio.

长话短说,

我放弃了这种方法,现在我自己读取app.config文件以获取我需要的数据.应该很容易修改来读取Resources.xml文件.

<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Xml" #>
<#@ assembly name="System.Xml.Linq" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Xml.Linq" #>

<#
var xmlFile = Path.Combine(Path.GetDirectoryName(Host.TemplateFile), "..", "app.config");
var query = from x in XElement.Load(xmlFile).Element("userSettings").Element("Your.Namespace.Properties.Settings").Elements("setting")
            select x;
#>

namespace Your.Namespace.Properties
{
    public sealed partial class Settings
    {
        public static class PropertyNames
        {

        <# foreach (var item in query) { #>
        public static readonly string <#=item.Attribute("name").Value#> = @"<#=item.Attribute("name").Value#>";
        <# } #>

        }
    }
}
Run Code Online (Sandbox Code Playgroud)