7

これが可能かどうか、またはこの効果のあるものかどうか疑問に思います。

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について話しています。静的ではなく、モデルの他のプロパティに基づいている可能性があります。これはどうにか可能ですか?

4

2 に答える 2

3

国際化などの目的で、DisplayNameAttribute、DescriptionAttribute、CategoryAttributeなどの主要な属性をサブクラス化し、ルックアップ(resx、データベースなど)を使用できます。これは正常に機能し、例を見つけるのは簡単です。

ただし、次の理由だけで、オブジェクトの値にアクセスすることはできません。属性にそのコンテキストが与えられていない!

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

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

于 2012-02-24T18:06:13.753 に答える
3

属性のパラメーターに指定された引数は定数値でなければならないため、これは不可能です(他に関連するコンテキストがなく、コンパイル時に必ずしも解決できるとは限らないため(これは要件です))。C#仕様(3.0)§17.2から:

次のすべてのステートメントが真である場合、式E属性引数式です。

  • のタイプEは属性パラメータタイプ(§17.1.3)です。
  • コンパイル時に、の値はE次のいずれかに解決できます。
    • 定数値。
    • System.Typeオブジェクト。
    • attribute-argument-expressionsの1次元配列。
于 2012-02-24T17:05:37.123 に答える