Frage

Hier ist das Problem. Ich möchte eine Klasse erstellen, die Konfigurationsdaten enthalten. Diese Daten bestehen aus Schlüssel / Wert-Paaren. Einige Beispiele: „hostname“ = „localhost“, „Timeout“ = 1000, etc .. Meine ursprüngliche Idee war, alle diese in einem allgemeinen Wörterbuch zu speichern:

private Dictionary<string, ConfigurationItem<object>> Configuration = 
    new Dictionary<string, ConfigurationItem<object>>();

Und die Configuration Item-Klasse wie:

public class ConfigurationItem<T>
{
    public string Name { get; set; }
    public T Value { get; set; }
}

Meine Hoffnungen sind, dass ich die Konfiguration abfragen und setzen sich wie folgt:

int i = Configuration.Get<int>("Timeout");
Configuration.Set("Timeout", 1000);

Leider kann ich nicht Elemente in der Konfigurations Wörterbuch fügen Sie den folgenden Code verwendet:

public void SetValue<T>(string key, ConfigurationItem<T> value)
{
        if (Configuration.ContainsKey(key.ToUpper()))
            Configuration[key.ToUpper()] = **value**;
        else
            Configuration.Add(key.ToUpper(),  **value**);
}

Die fett gedruckten Teile zeigen Fehler:

  

Kann Typen nicht konvertieren Configuration Item zu Configuration Item

Ich bin mit C # 4.0, da ich auf Fest dieses Problem zu hoffen, die neue Varianz-Funktion, aber bisher kein Glück. Wenn mehr Informationen benötigt werden, nennen Sie es einfach! Vielen Dank für Ihre Hilfe!

War es hilfreich?

Lösung

Sie könnten nur Ihr Wörterbuch als private Dictionary definieren, und werfen die Objekte, bevor Sie sie von Ihrem Get-Methode zurück.

Andere Tipps

Kovarianz und Kontra in C # 4.0 gilt nur für Schnittstellen und Teilnehmer.

Sie müssen den Typ-Parameter mit in oder out Präfix, abhängig von der Lage der Nutzungen des Typs Parameter in den Definitionen der Schnittstelle Element.

Zum Beispiel:

public interface IConfigurationItem<out T>
{
    public string Name { get; set; }
    public T Value { get; set; }
}

Da IDictionary<TKey,TValue> verwendet sowohl den Typ Parameter für Ein- und Ausgänge, Wörterbuch nicht kovarianten oder kontra.

Von C # 4.0 Entwurfsspezifikation Varianz Einschränkungen

23,3 Einschränkungen Co- und kontra Typ-Parameter können nur auf Schnittstellen und Delegattypen deklariert werden. Co- und Kontra gilt nur, wenn es eine Referenz (oder Identität) Umwandlung zwischen den Typargumente ist. Zum Beispiel ist ein IEnumerable<int> kein IEnumerable<object>, da die Umwandlung von int zu Objekt eine Box-Konvertierung, keine Referenzkonvertierung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top