4

Ruby on Railsの構成には、モデルのプロパティ名の平易な英語バージョンを定義できるYAMLファイルがあります。実際には、プレーンな任意の言語のバージョンを定義できます。これは国際化の一部ですが、ほとんどの人は、モデルの検証結果をユーザーに表示するなどの目的で使用します。

.NETMVC4プロジェクトにはそのような機能が必要です。ユーザーがフォームを送信すると、投稿したほとんどすべてのメールが届きます(フォームはモデルにバインドされます)。リフレクションによってプロパティ/値のペアのHTMLテーブルをダンプするヘルパーメソッドを作成しました。

foreach (PropertyInfo info in obj.GetType()
    .GetProperties(BindingFlags.Public | 
                   BindingFlags.Instance | 
                   BindingFlags.IgnoreCase)) 
{
  if (info.CanRead && !PropertyNamesToExclude.Contains(info.Name)) 
  {
    string value = info.GetValue(obj, null) != null ? 
                                            info.GetValue(obj, null).ToString() :
                                            null;
    html += "<tr><th>" + info.Name + "</th><td>" + value + "</td></tr>";
  }
}

ただし、もちろん、これはinfo.Name「OrdererGid」のように出力されますが、「OrdererUsername」の方が適切な場合もあります。.NETにこのようなものはありますか?

4

2 に答える 2

10

これを可能にするDisplayNameと呼ばれるデータ属性があります。モデルのプロパティに、これとそれぞれのわかりやすい名前で注釈を付けるだけです。

[DisplayName("Full name")]
public string FullName { get; set; }
于 2013-01-10T22:34:17.127 に答える
1

答えてくれた@Stokedoutと@Clemensに感謝します。実際、リフレクションによるアクセスは少し複雑でした。何らかの理由で、CustomAttributesプロパティに直接アクセスできませんでした。ついにこれに来ました:

DisplayNameAttribute dna = (DisplayNameAttribute)info
    .GetCustomAttributes(typeof(DisplayNameAttribute), true).FirstOrDefault();

string name = dna != null ? dna.DisplayName : info.Name;

string value = info.GetValue(obj, null) != null ? 
     (info.GetValue(obj, null).GetType().IsArray ? 
           String.Join(", ", info.GetValue(obj, null) as string[]) : 
           info.GetValue(obj, null).ToString()) : 
      null;

html += "<tr><th>" + name + "</th><td>" + value + "</td></tr>";
于 2013-01-11T22:01:58.437 に答える