2012-02-24 14 views
5

これが可能かどうか、またはこの効果があるかどうかわかりません。変数DisplayAttributeの名前、動的表示名

public class MyModel 
{ 
    public string Name { get; set; } 

    [Display(Name = String.Format("This is [0]'s phone number", Name)] 
    public string PhoneNumber { get; set; } 
} 

私は変数にDisplayNameがあり、静的ではなく、場合によってはモデルの他のプロパティに基づいています。これはどんな方法でも可能ですか?

答えて

3

これは不可能です。属性のパラメータに指定された引数が定数である必要があります(本質的には、他に関連するコンテキストがなく、必ずコンパイル時に解決できないためです))。

  • Eのタイプは属性パラメータのタイプである:C#の仕様(3.0)§17.2から:次のすべてに該当する場合

    表現E属性引数の式です(§17.1.3)。

    • 定数値:コンパイル時
    • は、Eの値は、次のいずれかに解決することができます。
    • System.Typeオブジェクト。
    • 属性 - 引数式の1次元配列。
    • 国際化などの目的のために
3

、することができますサブクラス DisplayNameAttribute、DescriptionAttributeとCategoryAttributeなどの主要な属性、およびいくつかのルックアップを使用(RESX、データベース、何でも)。これはうまく動作し、例を見つけるのは簡単です。

ただし、はオブジェクトのアクセス値をにすることはできません。なぜなら、属性にはそのコンテキストが指定されていないからです!

PropertyGrid、DataGridViewなどの場合は、ICustomTypeDescriptorまたはTypeDescriptionProviderのどちらかを使用して、必要なDisplayNameを指定できるカスタム記述子を指定する方法もあります。カスタム記述子のインスタンスを作成するときに、ターゲットオブジェクト/プロパティを取得できます。プロパティを調整するだけの場合は、ICustomTypeDescriptor/TypeDescriptionProviderよりも実装が簡単なTypeConverterもありますが、最終的にはどちらもカス​​タムPropertyDescriptor実装が必要です。

これはすべてかなりの作業です。あなたはこのレベルの複雑さに満足していることを確認してください!おそらくもっと簡単なオプションがあります。

+0

このアイデアをいくつかのコードでお知らせください。 –

関連する問題