如何生成AspNetCore风格带Format方法的Resource类
生成AspNetCore风格的格式化资源类
要实现像AspNetCore那样自动生成带FormatXXX格式化方法的Resource类,可通过以下几种方式解决:
方式一:使用Microsoft.Extensions.Localization工具链
这是最贴近AspNetCore实现的方案:
- 安装NuGet包:
Microsoft.Extensions.Localization和Microsoft.Extensions.Localization.Abstractions - 修改项目文件(.csproj),替换默认的资源代码生成配置:
<ItemGroup> <EmbeddedResource Include="Resources.resx"> <Generator>ResXFileCodeGenerator</Generator> <LastGenOutput>Resources.Designer.cs</LastGenOutput> <Localizable>True</Localizable> </EmbeddedResource> <Compile Update="Resources.Designer.cs"> <DesignTime>True</DesignTime> <AutoGen>True</AutoGen> <DependentUpon>Resources.resx</DependentUpon> </Compile> </ItemGroup> <PropertyGroup> <GenerateResourceDesignerFile>True</GenerateResourceDesignerFile> <ResourceDesignerNamespace>你的命名空间</ResourceDesignerNamespace> <UseResourceKeysAsNames>True</UseResourceKeysAsNames> </PropertyGroup>
- 在
Resources.resx中添加带占位符的资源项,例如键为InvalidUserName,值为"{0} 不是有效的用户名。" - 重新生成项目后,自动生成的
Resources.Designer.cs中会包含FormatInvalidUserName(string userName)这类格式化方法,直接调用即可。
方式二:自定义T4模板生成
如果不想引入Localization依赖,可通过T4模板手动生成格式化方法:
- 在项目中添加一个T4模板文件(例如
ResourcesGenerator.tt) - 编写模板逻辑读取ResX文件并生成对应代码,示例模板:
<#@ template language="C#" #> <#@ assembly name="System.Windows.Forms" #> <#@ import namespace="System.Resources" #> <#@ import namespace="System.IO" #> <#@ import namespace="System.Linq" #> namespace 你的命名空间 { public static class Resources { private static readonly System.Resources.ResourceManager _resourceManager = new System.Resources.ResourceManager(typeof(Resources)); <# var resxFilePath = Path.Combine(Host.ResolvePath("."), "Resources.resx"); using var reader = new ResXResourceReader(resxFilePath); foreach (System.Collections.DictionaryEntry entry in reader) { var resourceKey = entry.Key.ToString(); var resourceValue = entry.Value?.ToString() ?? string.Empty; var placeholderCount = resourceValue.Split('{').Length - 1; if (placeholderCount > 0) { var methodParameters = string.Join(", ", Enumerable.Range(0, placeholderCount).Select(i => $"string arg{i}")); var formatArguments = string.Join(", ", Enumerable.Range(0, placeholderCount).Select(i => $"arg{i}")); #> public static string Format<#= resourceKey #>(#= methodParameters #) { return string.Format(_resourceManager.GetString("<#= resourceKey #>"), <#= formatArguments #>); } <# } else { #> public static string <#= resourceKey #> => _resourceManager.GetString("<#= resourceKey #>"); <# } } #> } }
- 保存模板后,Visual Studio会自动生成包含格式化方法的资源类,后续修改ResX文件后右键模板选择"运行自定义工具"即可更新代码。
方式三:复用AspNetCore的自定义MSBuild任务
AspNetCore的MSBuild:_GenerateResxSource是自定义的MSBuild任务,你可以:
- 参考AspNetCore仓库中的资源生成任务代码,提取相关逻辑
- 将任务编译为自定义MSBuild工具,添加到项目的MSBuild配置中,替代默认的
PublicResXFileCodeGenerator
内容的提问来源于stack exchange,提问作者Kumima
相关产品推荐
相关产品推荐

