2010-01-23 77 views
1

在C#中,屬性參數需要是常量表達式,typeof或數組創建表達式。C#中的本地化屬性參數

各種庫,例如像城堡驗證,允許指定傳遞什麼似乎像本地化錯誤消息屬性構造:

//this works 
[ValidateNonEmpty("Can not be empty")] 

//this does not compile 
[ValidateNonEmpty(Resources.NonEmptyValidationMessage)] 

有什麼辦法如何處理這個問題,本地化這些爭論?

如果在使用Castle Validator時沒有解決方法,是否有類似於Castle Validator的驗證庫,允許驗證消息的本地化?

編輯:我發現數據註釋驗證庫如何解決這個問題。非常優雅的解決方案:http://haacked.com/archive/2009/12/07/localizing-aspnetmvc-validation.aspx

回答

0

它的工作原理開箱:

[ValidateNonEmpty(
     FriendlyNameKey = "CorrectlyLocalized.Description", 
     ErrorMessageKey = "CorrectlyLocalized.DescriptionValidateNonEmpty", 
     ResourceType = typeof (Messages) 
     )] 
    public string Description { get; set; } 
+0

謝謝,那真是太好了,但我使用的Castle Validator的ValidateNonEmptyAttribute版本沒有這些屬性。我只看到errorMessage,RunWhen,ExecutionOrder和FriendlyName。 – Marek 2010-01-23 15:13:41

+1

哪個版本的Castle驗證器具有這些屬性?你可以發佈一個下載鏈接嗎? – Marek 2010-01-23 15:18:25

+0

有點棘手,但SVN版本有它。 https://svn.castleproject.org/svn/castle/Components/Validator/trunk/感謝您指出這一點! – Marek 2010-01-23 15:26:55

4

我們有一個類似的問題,雖然沒有與城堡。我們使用的解決方案是簡單地定義一個從另一個派生而來的新屬性,它使用常量字符串作爲資源管理器的查找,如果找不到任何字符串,則會返回到該字符串本身。

[AttributeUsage(AttributeTargets.Class 
    | AttributeTargets.Method 
    | AttributeTargets.Property 
    | AttributeTargets.Event)] 
public class LocalizedIdentifierAttribute : ... { 
    public LocalizedIdentifierAttribute(Type provider, string key) 
    : base(...) { 
    foreach (PropertyInfo p in provider.GetProperties(
     BindingFlags.Static | BindingFlags.NonPublic)) { 
     if (p.PropertyType == typeof(System.Resources.ResourceManager)) { 
     ResourceManager m = (ResourceManager) p.GetValue(null, null); 

     // We found the key; use the value. 
     return m.GetString(key); 
     } 
    } 

    // We didn't find the key; use the key as the value. 
    return key; 
    } 
} 

用法是一樣的東西:

[LocalizedIdentifierAttribute(typeof(Resource), "Entities.FruitBasket")] 
class FruitBasket { 
    // ... 
} 

然後每個特定地區的資源文件可以定義自己的Entities.FruitBasket項,根據需要。

+0

謝謝,這是一個非常優雅的解決方案如何包裝現有庫,允許這種行爲。 – Marek 2010-01-23 15:34:36

+0

你也可以使用'nameof(Entities.FruitBasket)',資源ID可以改變。 – 2017-05-05 21:41:16