2016-03-25 16 views
1

ich für die richtige Syntax suche einen impliziten Operator für eine Klasse zu verwenden, die einen Indexer ein eigenes Wörterbuch Acess verwendet:Syntax für impliziten Operator mit Klasse Indexer

[System.Serializable] 
public class MyClass : IEnumerable 
{ 
    private Dictionary<string, object> vars = new Dictionary<string, object>(); 

    public object this[string key] 
    { 
     get 
     { 
      if(vars.ContainsKey(key)) 
      { 
       return (object)vars[key]; 
      } 
      else 
      { 
       return null; 
      } 
     } 

     set 
     { 
      object o = value; 
      if(!vars.ContainsKey(key)) 
      { 
       vars.Add(key, o); 
      } 
      else if(value == null) 
      { 
       vars.Remove(key); 
      } 
      else 
      { 
       vars[key] = o; 
      } 
     } 
    } 

/*some code*/ 

    public static implicit operator bool(WorldVars w, string i) 
    { 
     if(w[i] != null) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

Im Augenblick ist die Verwendung ist ziemlich geradlinig

MyClass[anykey] = myValue 

aber ich möchte einen schnelleren Weg zu implementieren, um die Anwesenheit eines Wertes zu testen, wie:

if(MyClass[anykey]) 
    { //logic } 
+2

Die Bedeutung von 'if (MyClass [k])' muss so sein, dass der mit dem Schlüssel verknüpfte Wert wahr ist, nicht dass der Schlüssel in der Sammlung existiert! Was wäre, wenn der Wert von 'MyClass [k]' existierte und * falsch * war? Das wäre sehr verwirrend, wenn dieser Ausdruck als wahr betrachtet würde. –

+0

Verdammt! Vielen Dank! Zu viel Denken, dass ich sogar den Beweis dafür verloren habe. Danke noch einmal! – Ulrag

Antwort

0

As commenter Eric notes, die Semantik Ihrer Klasse wäre komplett kaputt, wenn Sie das erreichen könnten, wonach Sie fragen. Der ganze Punkt des Indexers ist so, dass beim Schreiben des Ausdrucks myClass[anyKey] der Wert, den Ihre Klasse mit anyKey assoziiert, ausgewertet wird.

Wenn Sie waren die Umsetzung zu ändern, so dass es einfach einen bool Wert darstellt Eindämmung zurückgegeben, dann würden Sie mit stecken einige andere Mechanismus zu implementieren, um tatsächlich den Wert abzurufen (zum Beispiel ein separates Verfahren). Zusätzlich würde es auch die Frage aufwerfen, was der Setzer tun sollte.

Angesichts der Implementierung, die Sie zeigen, scheint mir, dass Schreiben if (myClass[anyKey] != null) nicht wirklich unbequem ist, und es scheint mir ziemlich ausdrucksvoll. Das heißt, es ist ein vernünftiger Weg, den Code klar zum Ausdruck zu bringen.

Das hieß, wenn Sie etwas ausdruck tun wollen, ist es nicht unvernünftig sein würde, eine ContainsKey() Methode in der Klasse für den Zweck zu schreiben:

public bool ContainsKey(string key) { return vars.ContainsKey(key); } 

Dann könnten Sie wie für den Schlüssel des Anwesenheitskontrolle:

if (myClass.ContainsKey[anyKey]) { ... } 


Schließlich ist der Code, den Sie geschrieben soll in akzeptabler Weise gut funktionieren, aber es scheint allzu ausführlich und inkonsistent zu mir. IMHO, eine bessere Möglichkeit, Ihre Indexer Methoden zu schreiben, wäre so etwas wie dieses:

public object this[string key] 
{ 
    get 
    { 
     object o; 

     return vars.TryGetValue(key, out o) ? o : null; 
    } 

    set 
    { 
     if (value != null) 
     { 
      vars[key] = value; 
     } 
     else 
     { 
      vars.Remove(key); 
     } 
    } 
} 

Das Implementierung vermeidet Dinge wie:

  • Redundant Check für Rückhaltung, wenn ein Wert
  • Kopieren value in lokale bekommen Variable unnötig beim Setzen eines Wertes
  • Mit zwei verschiedenen Codezeilen, die beide bewirken, dass der Wert für einen Schlüssel im Wörterbuch
  • gesetzt wird
+0

Danke! Ich denke, ich war zu müde, um das Offensichtliche vor mir zu sehen. – Ulrag

+0

Es passiert.:) Der Grund, warum ich die Antwort geschrieben habe, war, dass ich, wenn ich andere Optionen für die Disposition Ihrer Frage in Betracht zog, immer wieder zu dem Gedanken kam, dass wenn Sie sich selbst, gerade wegen Müdigkeit, mit dem Problem kämpfen möglich, dass jemand anderes in der Zukunft einen ähnlichen Anstoss in die richtige Richtung benötigt und benötigen würde. Eine formelle Antwort sollte helfen, sicherzustellen, dass diese Leute das zweite Aussehen bekommen, das sie brauchen. –