2010-01-07 7 views
9

Ich habe ein Szenario, wo ich eine benutzerdefinierte Mapping-Klasse habe.Wie kann ich einen Konstruktor mit Inline-Initialisierung für eine benutzerdefinierte Kartenklasse implementieren?

Ich möchte in der Lage sein, die neue Instanz zu erstellen und Daten für sie zugleich zu erklären und eine Syntax ähnlich zu implementieren:

public static HybridDictionary Names = new HybridDictionary()   
    { 
     {People.Dave, "Dave H."}, 
     {People.Wendy, "Wendy R."} 
    } 

und so weiter. Wie definiere ich meine Klasse, um diese Art von Syntax zu aktivieren?

Antwort

7

Was Sie versuchen, eine IEnumerable <>Collection Initializer

Ihre Hybriddictionary Klasse implementieren müssen acheive und ein Add-Methode wie folgt aussehen:

public void Add(People p, string name) 
{ 
    .... 
} 

Dann sollte Ihre Instanziierung funktionieren.

. Hinweis: Per Konvention sollte der Schlüssel der erste Parameter durch den Wert (dh void add (String-Schlüssel, Menschen Wert)

+2

Correct gefolgt Der Compiler für ein Verfahren sieht genannt 'Add()' mit. eine passende Menge von Argumenten - und es erfordert den Typ implementieren IEnumerable oder IEnumerable . Es ist so einfach wie das. – LBushkin

+0

Nur eine zusätzliche Anmerkung hier, aber Sie müssen wirklich nichts mit der IEnumerable-Implementierung tun, können Sie einfach werfen oder zurückgeben Null. – MrUnleaded

4

Grundsätzlich sollten Sie ICollection <T> implementieren, aber hier ist eine detailliertere Erklärung: http://blogs.msdn.com/madst/archive/2006/10/10/What-is-a-collection_3F00_.aspx.

In dem Artikel erklärt Mads Torgersen, dass ein Muster-basierter Ansatz verwendet wird, so dass die einzige Voraussetzung ist, dass Sie eine öffentliche Add-Methode mit den richtigen Parametern benötigen und IEnumerable implementieren. Mit anderen Worten, ist dieser Code gültig und funktioniert:

using System.Collections; 
using System.Collections.Generic; 

class Test 
{ 
    static void Main() 
    { 
     var dictionary = new HybridDictionary<string, string> 
           { 
            {"key", "value"}, 
            {"key2", "value2"} 
           }; 
    } 
} 

public class HybridDictionary<TKey, TValue> : IEnumerable<KeyValuePair<TKey, TValue>> 
{ 
    private readonly Dictionary<TKey, TValue> inner = new Dictionary<TKey, TValue>(); 
    public void Add(TKey key, TValue value) 
    { 
     inner.Add(key, value); 
    } 

    public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator() 
    { 
     return inner.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 
Verwandte Themen