7

在我的 Windows Store (Metro) 应用程序中,我正在为我的对象使用 DataAnnotations。一切正常。

现在我尝试将我的字符串放入Resource.resw文件中。DataAnnotations 需要填写 2 个属性:ErrorMessageResourceNameErrorMessageResourceType. 如何使用ErrorMessageResourceType新的资源类型?

public class Person : Entity
{
    private string _firstName;

    [Required( ErrorMessageResourceName = "GenericFieldRequired", ErrorMessageResourceType = typeof( ??? ))]
    public string FirstName {
        get { return _firstName; }
        set { SetPropertyChanged( ref _firstName, value, this ); }
    }
}

有什么建议么?

更新: 我找到了一个自动生成 Resources.cs 文件的 Visual Studio 工具:

转速发生器

4

1 回答 1

8

经过大量挖掘,我想我明白你为什么会遇到问题。

在其他项目类型中,资源文件会自动转换为具有称为资源键名称的静态方法的类。

没有办法真正自动执行此操作,因此我编写了一个 T4 模板来帮助您解决此问题。

<#@ template debug="false" hostspecific="True" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Xml" #>
<#@ assembly name="System.Xml" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>
using Windows.ApplicationModel.Resources;
<# 
  var namespaceName = System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("NamespaceHint");
#> 
namespace <#= namespaceName #>
{ 
    public class ResourceHelper
    {
        private static readonly ResourceLoader resourceLoader = new ResourceLoader("Resources");
<# using (XmlReader reader = XmlReader.Create(Host.ResolvePath("Resources.resw")))
        {
             bool found=reader.ReadToFollowing("data");
             while(found)
             {
                reader.MoveToFirstAttribute();
                string name = reader.Value;     

#>
            public static string <#= name #>
            {
                get
                {
                    return resourceLoader.GetString("<#= name #>");
                }
            }
<#
                found=reader.ReadToFollowing("data");
            }
        }#>

    } 
}

如果您将模板放在与资源文件相同的文件夹中,它将输出一个名为 ResourceHelper.cs 的文件。然后可以在您的对象模型中使用它:-

 [Required(ErrorMessageResourceName = "validation_string", ErrorMessageResourceType = typeof(ResourceHelper))]

请注意,有一些限制。首先,我不太擅长 T4 模板,因此代码可能会大大改进。现在你必须确保你给你的资源的名字会产生一个有效的方法名——不要在里面放空格!

其次,当您在资源文件中添加新的键/值时,模板不会自动生成,您必须进入模板并点击保存。

除此之外,它应该可以正常工作-希望对您有所帮助!

于 2012-12-21T00:13:38.007 回答