Pergunta

Aqui está o problema. Eu gostaria de criar uma classe que irá conter dados de configuração. Estes dados consistem de pares de chave / valor. Alguns exemplos: "hostname" = "localhost", "tempo de espera" = 1000, etc .. Minha idéia inicial era para armazenar tudo isso em um dicionário genérico:

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

E a classe item de configuração como:

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

As minhas esperanças são que eu possa consultar e definir a configuração da seguinte forma:

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

Infelizmente, eu não posso inserir itens no dicionário de configuração utilizando o seguinte 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**);
}

As peças ousadas estão mostrando erros:

Não é possível converter tipo de item de configuração para item de configuração

Eu estou usando C # 4.0 desde que eu esperava fixo este problema usando o novo recurso de variância, mas sem sorte até agora. Se forem necessárias mais informações, basta nomeá-la! Obrigado pela sua ajuda!

Foi útil?

Solução

Você poderia apenas definir o seu dicionário como dicionário privada , e lançou os objetos antes de devolvê-los a partir de seu método Get.

Outras dicas

Covariância e contravariance em C # 4.0 só se aplica a interfaces e delegados.

Você deve prefixar o parâmetro de tipo com in ou out, dependendo da localização de usos do parâmetro de tipo nas definições do membro interface.

Por exemplo:

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

Porque usos IDictionary<TKey,TValue> ambos os seus parâmetros de tipo para entradas e saídas, dicionário não são covariant ou contravariant.

De C # 4.0 projectos de limitações de variância especificação

23.3 Limitações parâmetros de tipo de co- e contravariantes só pode ser declarada em interfaces e tipos de delegado. Co- e contravariância aplica-se apenas quando há uma conversão de referência (ou identidade) entre os argumentos de tipo. Por exemplo, um IEnumerable<int> não é um IEnumerable<object> porque a conversão de int para objeto é uma conversão de boxe, não uma conversão de referência.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top