gpt4 book ai didi

c# - 是否有任何 T4 模板或自定义工具可以从 .resw 文件生成类?

转载 作者:行者123 更新时间:2023-11-30 14:35:35 27 4
gpt4 key购买 nike

我正在尝试将本地化添加到我的爱好项目(WinRT 应用程序)中的类库中。我很惊讶它没有为资源(.resw 文件)生成强类型类。是否有任何 T4 模板或自定义工具可以自动从资源中生成此类?

我自己编写了简单的 T4 模板,但我想知道是否有任何内置或 MS 提供的机制,因为自定义解决方案有一些缺点(例如,保存对资源的更改不会触发 T4 转换)。

最佳答案

这是我的原始解决方案(但它在 Windows 8 的 VS 2012 RC 中不起作用,因为它是 probably doesn't support Text templating )。您只需通过在模板中设置 inputFilePath 将模板配置为指向正确的资源文件。

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Xml" #>
<#@ assembly name="System.Xml.Linq" #>
<#@ assembly name="EnvDTE" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Xml.Linq" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="Microsoft.CSharp" #>
<#@ import namespace="EnvDTE" #>
<#@ output extension=".cs" #>
<#
DTE env = GetVSEnvironment();
var inputFilePath = @"Resources\Strings\en\Resources.resw";
var provider = new CSharpCodeProvider();
string className = CreateClassName(provider);

SetCurrentDirectory();
if (File.Exists(inputFilePath)) {
#>
using Windows.ApplicationModel.Resources;

namespace <#= GetNamespace() #> {
public static class <#= className #> {
private static ResourceLoader _resourceLoader;

static <#= className #>() {
_resourceLoader = new ResourceLoader("<#= GetResourcePath(env) #>");
}
<#
foreach (string name in GetResourceKeys(inputFilePath)) {
#>
public static string <#= provider.CreateEscapedIdentifier(name) #> {
get { return _resourceLoader.GetString("<#= name #>"); }
}
<#
}
#>
}
}
<#
} else {
throw new FileNotFoundException(String.Format("Unable to find Resource file: {0}", inputFilePath));
}
#>
<#+
private DTE GetVSEnvironment() {
DTE env = null;
var provider = Host as IServiceProvider;
if (provider != null) {
env = provider.GetService(typeof(DTE)) as DTE;
}

if (env == null) {
throw new InvalidOperationException("Template must be executed from Visual Studio");
}

return env;
}

private void SetCurrentDirectory() {
Directory.SetCurrentDirectory(Host.ResolvePath(""));
}

private string CreateClassName(CSharpCodeProvider provider) {
string name = Path.GetFileNameWithoutExtension(Host.TemplateFile);
return provider.CreateEscapedIdentifier(name);
}

private string GetNamespace() {
return Host.ResolveParameterValue("directiveId", "namespaceDirectiveProcessor", "namespaceHint");
}

private string GetResourcePath(DTE env) {
Project project = env.Solution.FindProjectItem(Host.TemplateFile).ContainingProject;
string assemblyName = project.Properties.Item("AssemblyName").Value.ToString();
return assemblyName + "/Resources";
}

private static IEnumerable<string> GetResourceKeys(string filePath) {
XDocument doc = XDocument.Load(filePath);
return doc.Root.Elements("data").Select(e => e.Attribute("name").Value);
}
#>

我想我会通过用于 .resx 文件的普通自定义工具来解决这个问题,但是 Metro 风格的应用程序需要使用不同的命名空间。

关于c# - 是否有任何 T4 模板或自定义工具可以从 .resw 文件生成类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11872807/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com