2010-05-25 4 views
5

Ho visto molte domande e risposte sul mapping delle stringhe su enumerati e viceversa, ma come posso mappare una serie di stringhe localizzate alle enumerazioni?Come posso internazionalizzare le stringhe che rappresentano i valori enum di C#?

Devo solo creare un extension method like this che restituisca la stringa corretta da un file di risorse? C'è un modo per localizzare attributi (come "Descrizione") che vengono utilizzati in solutions like this?

Qual è la soluzione preferita: metodo di estensione o attributi. Mi sembra che questo non sia lo scopo previsto degli attributi. In effetti, ora che ci penso, se dovessi usare un metodo di estensione, un attributo mi sembrerebbe qualcosa che userei per specificare una chiave in un file di risorse per la stringa localizzata che voglio usare al posto del valore enum.

EDIT - ad esempio:

Dato il seguente enum,

public enum TransactionTypes { 
    Cheque = 1, 
    BankTransfer = 2, 
    CreditCard = 3 
} 

Vorrei un modo per mappare ogni tipo da una stringa localizzata. Ho iniziato con un metodo di estensione per l'enum che utilizza un'istruzione switch e riferimenti fortemente tipizzati al file di risorse.

Tuttavia, un metodo di estensione per ogni enumerazione non sembra una grande soluzione. Ho iniziato a seguire this per creare un attributo personalizzato per ogni valore enumerato. L'attributo ha un nome e una chiave di base per il file di risorse contenente stringhe localizzate. Nel enum sopra, per esempio, ho questo:

... 
[EnumResourceAttribute("FinancialTransaction", "Cheque")] 
Cheque = 1, 
... 

Dove "FinanacialTransaction" è il file RESX e "Check" è la chiave di stringa. Sto provando a creare un metodo di utilità a cui potrei passare qualsiasi valore da qualsiasi enumerazione e restituire la rappresentazione stringa localizzata di quel valore, assumendo che l'attributo personalizzato sia specificato. Non riesco proprio a capire come accedere dinamicamente a un file di risorse ea una chiave al suo interno.

risposta

2

ho continuato con gli attributi personalizzati e creato questo metodo di utilità:

public static string getEnumResourceString(Enum value) 
    { 
     System.Reflection.FieldInfo fi = value.GetType().GetField(value.ToString()); 
     EnumResourceAttribute attr = (EnumResourceAttribute)System.Attribute.GetCustomAttribute(fi, typeof(EnumResourceAttribute)); 
     return (string)HttpContext.GetGlobalResourceObject(attr.BaseName, attr.Key); 
    } 
8

Suggerisco sicuramente di utilizzare un file di risorse, probabilmente con un metodo (estensione o altro) per semplificare l'accesso alla risorsa pertinente. Man mano che il numero di lingue supportate cresce, non si vuole veramente che il codice sia pieno di testo, distraendovi dai valori stessi.

Allo stesso modo società di traduzione sono suscettibili di essere orientata per gestire resx - non stanno andando a voler pasticciare nel codice sorgente, e non si deve lasciare che facciano comunque :)

Proprio utilizzare le risorse che sono imperniate sul nome dell'enum e il valore al suo interno. Semplice, ridimensiona a enumerazioni multiple e più lingue, non ingombra il codice sorgente, funziona bene con gli strumenti di traduzione ed è in linea con il flusso di i18n all'interno di .NET.

EDIT: Per la mappatura dei valori enum per i nomi delle risorse, avevo appena fare qualcosa di simile:

public static string ToResourceName<T>(this T value) where T : struct 
{ 
    return typeof(T).Name + "." + value; 
} 

Poi si potrebbe fare:

string resource = MyEnum.SomeValue.ToResourceName(); 

Ovviamente che sta eseguendo concatenazione di stringhe ogni volta - Si potrebbe cache che se si desidera, ma non mi preoccuperei meno che non hai avuto qualche indicazione che in realtà era un problema.

Ciò non impedisce di utilizzare il metodo di estensione per non enumerazione, ovviamente. Se vuoi farlo, ti serve qualcosa come Unconstrained Melody.

+0

+1 ero 1 min troppo tardi :) –

+0

avrei dovuto essere più chiaro - non avevo intenzione di usare qualcosa di diverso file di risorse (li stiamo già utilizzando per tutto il resto che richiede i18n). Sto cercando soluzioni per mappare le stringhe di risorse per l'enumerazione. – Matt

+0

@Duke: Ok, non è molto chiaro cosa vuoi allora - Ho aggiornato la mia risposta con un metodo di estensione molto semplice, ma sospetto che tu stia cercando qualcosa di più ... –

Problemi correlati