Pregunta

Aquí está el problema. Me gustaría crear una clase que contendrá los datos de configuración. Estos datos constan de pares clave / valor. Algunos ejemplos: "hostname" = "localhost", "tiempo de espera" = 1000, etc .. Mi idea inicial era para almacenar todos estos en un diccionario genérico:

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

Y la clase ConfigurationItem como:

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

Mis esperanzas son que puedo consultar y establecer la configuración de la siguiente manera:

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

Por desgracia, no puedo insertar elementos en el diccionario de configuración utilizando el siguiente código:

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

Las partes en negrita están mostrando errores:

  

No se puede convertir tipo ConfigurationItem para ConfigurationItem

Estoy usando C # 4.0, ya que esperaba que fija este problema utilizando la nueva función de la varianza, pero sin suerte hasta ahora. Si se necesita más información, sólo tienen que pedir! Gracias por su ayuda!

¿Fue útil?

Solución

Se podía definir su diccionario como diccionario privada , y emitir los objetos antes de que regrese de su método GET.

Otros consejos

Covarianza y contravarianza en C # 4.0 sólo se aplica a las interfaces y delegados.

Debe prefijar el parámetro de tipo con in o out, dependiendo de la localización de los usos del parámetro de tipo en las definiciones de los miembros interfaz.

Por ejemplo:

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

Debido IDictionary<TKey,TValue> utiliza tanto sus parámetros de tipo de entradas y salidas, diccionario no son covariantes o contravariantes.

A partir de C # 4.0 limitaciones de calado especificación de varianza

23.3 Limitaciones los parámetros de tipo co- y contravariant sólo pueden ser declaradas en las interfaces y tipos de delegado. Co- y contravarianza sólo se aplica cuando hay una conversión de referencia (o identidad) entre los argumentos de tipo. Por ejemplo, un IEnumerable<int> no es una IEnumerable<object> porque la conversión de int a objeto es una conversión de boxeo, no una conversión de referencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top