2014-10-28 120 views
1

我有一個可選的錯誤文本像這樣的屬性:是否可以給一個屬性一個變量文本?

[DoubleRangeCheck(2.0, 10.0, ErrorMessage="Text shown on error")] 

現在我要本地化的錯誤信息,所以我試圖

[DoubleRangeCheck(2.0, 10.0, ErrorMessage=Properties.Resources.MsgLocalisedError)] 

但我得到一個編譯器錯誤,指出屬性必須是恆定的。

error CS0182: An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type 

所以這是不可能的,或者我錯過了什麼?

如何將文本參數本地化爲屬性?

回答

1

屬性,如編譯器狀態,只能用常數值表示 - 它們是,實質上是序列化並存儲在元數據中。但是,通過對它們進行子分類並使子類覆蓋某些爲此目的而暴露的虛擬方法,通常可以對它們進行本地化。例如,對於[Category("Foo")],你可以做這樣的事情:

class LocalizedCategoryAttribute : CategoryAttribute { 
    public LocalizedCategoryAttribute(string category) : base(category) { } 
    protected override string GetLocalizedString(string value) 
    { 
     // your code here! (treat "value" as the key) 
     return base.GetLocalizedString(value); 
    } 
} 

,然後用[LocalizedCategory("Foo")]裝飾。它的工作效果取決於特定屬性和消耗它們的代碼。

+0

我認爲這是正確的軌道。但是,我將如何做到這一點在自定義屬性(我沒有base.GetLocalizedString)?由於我的屬性在不同的程序集中,我不知道如何獲得正確的ResourceManager才能找到字符串。 – MTR 2014-10-28 11:03:28

+0

@MTR就像我說的:這一切都歸結爲'[DoubleRangeCheck(...)]'和/或*檢查該屬性的代碼是否設計時考慮了本地化。 – 2014-10-28 11:14:29

相關問題