Asp.net mvc PublicResXFileCodeGenerator的T4模板

Asp.net mvc PublicResXFileCodeGenerator的T4模板,asp.net-mvc,visual-studio,t4,resx,Asp.net Mvc,Visual Studio,T4,Resx,我想执行以下操作:在我的Web.config中添加一个开关,每当它打开时,来自.resx文件的任何值都将与它来自的.resx文件的名称一起出现。这主要用于调试目的 我目前的理解是,实现这一点的方法是创建一个自定义T4模板,并使用它而不是使用PublicResXFileCodeGenerator 我正试图找到一个模板,它可以实现PublicResXFileCodeGenerator所做的功能,然后在此基础上进行构建。在我安装的Visual Studio中是否有这样的模板?如果没有,我可以从官方的在

我想执行以下操作:在我的Web.config中添加一个开关,每当它打开时,来自.resx文件的任何值都将与它来自的.resx文件的名称一起出现。这主要用于调试目的

我目前的理解是,实现这一点的方法是创建一个自定义T4模板,并使用它而不是使用
PublicResXFileCodeGenerator


我正试图找到一个模板,它可以实现PublicResXFileCodeGenerator所做的功能,然后在此基础上进行构建。在我安装的Visual Studio中是否有这样的模板?如果没有,我可以从官方的在线资源中找到这样的模板吗?

Visual Studio使用StronglyTypedResourceBuilder类将.resx文件转换为“硬编码”资源。这就是为什么我认为VisualStudio安装中没有类似的T4模板

您可能需要创建自己的T4模板。我没有适用于您的案例的现成模板,但我将这样开始并替换字符串资源的默认资源生成器:

  • 从资源文件的属性网格中的CustomTool属性中删除“ResXFileCodeGenerator”
  • 删除现有的.Designer.cs文件
  • 将设置“DebugResources”添加到web.config
  • 将T4模板中的.resx文件作为XDocument打开(.resx是xml格式)

    
    
  • 迭代.resx文件中的所有元素并生成资源的属性。根据web.config中的设置,将资源文件名添加到返回值中

    <#
        foreach(var dataElement in resDoc.Descendants("data")
                                         .Where(elem => elem.Attribute("type") == null)
        {
    #>
        public static string <#= dataElement.Attribute("name").Value #> {
          get {
            return ResourceManager.GetString("<#= dataElement.Attribute("name").Value #>")
                   + ((bool.Parse(ConfigurationManager.AppSettings["DebugResources"])) 
                     ? " (MyResourceFile.resx)" 
                     : String.Empty);
    <#
        }
    #>
    
    elem.Attribute(“type”)==null)
    {
    #>
    公共静态字符串{
    得到{
    返回ResourceManager.GetString(“”)
    +((bool.Parse(ConfigurationManager.AppSettings[“DebugResources”]))
    ?“(MyResourceFile.resx)”
    :String.Empty);
    
  • 生成资源类的其余部分:资源管理器(可以从原始Designer.cs文件中复制),并检查如何处理图像和其他资源类型


  • 希望这个想法能有所帮助。也许我可以在某个时候提出一个完整的、可重用的.tt。

    谢谢Nico。我希望有办法进入设计器文件,用我从ResourceManager派生的CustomResourceManager替换所有System.Resources.ResourceManager。也许我可以运行一个脚本,我将包含在构建中。嗯,我同意e、 删除所有.designer.cs文件可能很耗时,可能会忘记删除一些文件。但对于生成过程,ResourceManager类位于哪个文件中并不重要。请查看此处:,这可能允许您实际替换设计器文件的内容。
    <#
        foreach(var dataElement in resDoc.Descendants("data")
                                         .Where(elem => elem.Attribute("type") == null)
        {
    #>
        public static string <#= dataElement.Attribute("name").Value #> {
          get {
            return ResourceManager.GetString("<#= dataElement.Attribute("name").Value #>")
                   + ((bool.Parse(ConfigurationManager.AppSettings["DebugResources"])) 
                     ? " (MyResourceFile.resx)" 
                     : String.Empty);
    <#
        }
    #>