You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成AspNetCore风格带Format方法的Resource类

生成AspNetCore风格的格式化资源类

要实现像AspNetCore那样自动生成带FormatXXX格式化方法的Resource类,可通过以下几种方式解决:

方式一:使用Microsoft.Extensions.Localization工具链

这是最贴近AspNetCore实现的方案:

  1. 安装NuGet包:Microsoft.Extensions.Localization和Microsoft.Extensions.Localization.Abstractions
  2. 修改项目文件(.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>
  1. 在Resources.resx中添加带占位符的资源项,例如键为InvalidUserName,值为"{0} 不是有效的用户名。"
  2. 重新生成项目后,自动生成的Resources.Designer.cs中会包含FormatInvalidUserName(string userName)这类格式化方法,直接调用即可。

方式二:自定义T4模板生成

如果不想引入Localization依赖,可通过T4模板手动生成格式化方法:

  1. 在项目中添加一个T4模板文件(例如ResourcesGenerator.tt)
  2. 编写模板逻辑读取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 #>");
<#
    }
}
#>
    }
}
  1. 保存模板后,Visual Studio会自动生成包含格式化方法的资源类,后续修改ResX文件后右键模板选择"运行自定义工具"即可更新代码。

方式三:复用AspNetCore的自定义MSBuild任务

AspNetCore的MSBuild:_GenerateResxSource是自定义的MSBuild任务,你可以:

  1. 参考AspNetCore仓库中的资源生成任务代码,提取相关逻辑
  2. 将任务编译为自定义MSBuild工具,添加到项目的MSBuild配置中,替代默认的PublicResXFileCodeGenerator

内容的提问来源于stack exchange,提问作者Kumima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 03:30:36