2012-02-24 108 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

這是不可能的,因爲爲屬性的參數指定的參數必須是常量值(本能地,因爲沒有與其他任何東西相關的上下文,並且不一定能夠在編譯時解析(這是一個要求))。從C#規範(3.0)§17.2:

表達式E屬性參數表達式如果以下所有的語句爲真:

  • 類型的E是一個屬性參數類型(§17.1.3)。
  • 在編譯時間,E值可以解析爲下列之一:
    • 恆定值。
    • System.Type對象。
    • attribute-argument-expressions的一維數組。
3

爲目的,如國際化,你可以關鍵屬性像DisplayNameAttribute,DescriptionAttribute和的CategoryAttribute,並使用一些查詢(RESX,數據庫,等等)。這工作正常,很容易找到示例。

但是,您不能對象的訪問值,只是因爲:沒有給出該屬性的上下文!但是,如果這是爲像PropertyGrid,DataGridView等東西,還有另一種方法:使用ICustomTypeDescriptor或TypeDescriptionProvider提供自定義描述符,它可以指定它想要的顯示名稱。您可以在創建自定義描述符的實例時捕獲目標對象/屬性。如果你只想調整屬性,有時TypeConverter比ICustomTypeDescriptor/TypeDescriptionProvider更容易實現,但最終都需要定製PropertyDescriptor實現。

這是所有相當的工作;確保你對這種複雜程度感到滿意!可能有一個更簡單的選項。

+0

請問您可以用一些代碼來闡述這個想法嗎? – 2017-04-28 19:03:28