2016-03-24 5 views
3

Zur Zeit habe ich eine Klasse wie unten bekommen:Wie Namen der Variablen über ihren Wert in der Klasse C#

public static class JurisdictionList 
{ 
    public const string NSW = "New South Wales"; 
    public const string NT = "Northern Territory"; 
    public const string QLD = "Queensland"; 
    public const string SA = "South Australia"; 
    public const string TAS = "Tasmania"; 
    public const string VIC = "Victoria"; 
    public const string WA = "Western Australia"; 
} 

Und ich will ein Verfahren schreiben string GetJurisdictionCode(string Jurisdiction) werden die Namen der oben konstant jeweils mit ihrem Wert zurückgeben . Zum Beispiel gibt GetJurisdictionCode(JurisdictionList.QLD) QLD zurück.

Derzeit weiß ich nur, dass dies mit Switch Case tun, aber es sieht ziemlich lang aus. Kennt jemand andere Wege, um es zu lösen? Danke im Voraus.

+1

Nicht ganz sicher, was du meinst ... aber Ihr Fall scheint mit 'Dictionary' – Ian

+0

Gibt es einen bestimmten Grund für die nicht mit Enum machbar zu sein? – uTeisT

Antwort

7

Nun, Du konnte Reflektion verwenden:

public static string GetJurisdictionCode(string jurisdiction) 
{ 
    return typeof(JurisdictionList) 
     .GetTypeInfo() 
     .DeclaredFields 
     .Where(f => (string) f.GetValue(null) == jurisdiction) 
     .FirstOrDefault() 
     ?.Name; 
} 

Aber persönlich würde ich ein Dictionary<string, string> empfehle den Aufbau von Code-Namen zu erhalten, und dann entweder nur mit:

return codes.Where(kvp => kvp.Value == jurisdiction) 
      .FirstOrDefault() 
      ?.Name; 

.. oder bauen Sie ein zweites Wörterbuch auf, um in die andere Richtung zu gehen. Wenn Sie auch die genannten Konstanten haben möchten, könnten Sie beide Wörterbücher immer durch Reflexion aufbauen, z.

Sie sollten auch überlegen, eine enum, dann Zuordnungen von der enum zu Namen.

2

Sie können nicht erreichen, was Sie tun möchten, ohne Reflection auf Ihrem Code zu machen oder es zum Beispiel für Dictionary zu verwenden.

Auch können Sie Ihren Code ändern C# 6 Operator „nameof“ stattdessen zu verwenden:

string code = nameof(JurisdictionList.QLD); // QLD 
0

Sie FieldInfo verwenden können und GetFields() durch die Felder iterieren Eigenschaft mit dem gewünschten Wert zu erhalten; Daraus ergibt sich die erwartete GetJurisdictionCode() sieht wie folgt aus:

public static string GetJurisdictionCode(string Jurisdiction) 
    { 
     foreach (FieldInfo p in typeof(JurisdictionList).GetFields()) 
     {    
      if (string.Equals(p.GetValue(p.Name),Jurisdiction))    
       return p.Name; 
     } 
     return "Not Found"; 
    } 
Verwandte Themen