7

Windowsストア(Metro)アプリでは、オブジェクトにDataAnnotationsを使用しています。すべてが正常に動作します。

次に、文字列をResource.reswファイルに配置しようとします。DataAnnotationsには、次の2つのプロパティを入力する必要がありErrorMessageResourceNameますErrorMessageResourceTypeErrorMessageResourceType新しいリソースタイプでどのように使用しますか?

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ファイルを自動的に生成するVisualStudioツールを見つけました。

Reswジェネレーター

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 に答える