Existe uma maneira de tornar esse método genérico para que eu possa retornar uma string, bool, int ou double? No momento, ele está retornando uma string, mas se puder encontrar "true" ou "false" como o valor da configuração, eu gostaria de retornar um bool, por exemplo.
public static string ConfigSetting(string settingName)
{
return ConfigurationManager.AppSettings[settingName];
}
c#
.net
generics
return-type
MacGyver
fonte
fonte
dynamic
palavra - chave. Existe um custo de desempenho para isso, mas para ler um arquivo de configuração, o custo de desempenho é quase certamente insignificante.Respostas:
Você precisa torná-lo um método genérico, como este:
Mas o chamador terá que especificar o tipo que espera. Você poderia usar potencialmente
Convert.ChangeType
, assumindo que todos os tipos relevantes sejam suportados:Não estou totalmente convencido de que tudo isso seja uma boa ideia, veja bem ...
fonte
ConfigSettingString
,ConfigSettingBool
, etc.) tem a vantagem de corpos de método que será menor, mais claro, e melhor focados .Você poderia usar
Convert.ChangeType()
:fonte
Existem várias maneiras de fazer isso (listadas por prioridade, específicas ao problema do OP)
Opção 1: Abordagem direta - Crie várias funções para cada tipo que você espera, em vez de ter uma função genérica.
Opção 2: quando você não deseja usar métodos sofisticados de conversão - converta o valor em objeto e, em seguida, em tipo genérico.
Nota - Isso gerará um erro se o elenco não for válido (seu caso). Eu não recomendaria fazer isso se você não tiver certeza sobre o tipo de conversão, em vez disso, vá para a opção 3.
Opção 3: Genérico com segurança de tipo - Crie uma função genérica para lidar com a conversão de tipo.
Nota - T é o tipo esperado, observe a restrição where aqui (o tipo de U deve ser IConvertible para nos salvar dos erros)
fonte
U
? Não faz sentido fazê-lo, e isso torna o método mais difícil de chamar. Apenas aceiteIConvertible
. Não acho que valha a pena incluir a segunda opção para essa pergunta, pois ela não responde à pergunta que está sendo feita. Você provavelmente deve também mudar o nome do método na primeira opção ...Você precisa converter o tipo do seu valor de retorno do método para o tipo genérico que você passa para o método durante a chamada.
Você precisa passar um tipo que pode ser convertido para o valor retornado por esse método.
Se você deseja retornar um valor que não é passível de digitação para o tipo genérico que você passa, talvez seja necessário alterar o código ou certifique-se de passar um tipo que pode ser convertido para o valor de retorno do método Portanto, essa abordagem não é recomendada.
fonte
return (T)Convert.ChangeType(number, typeof(T));
era exatamente o que eu estava faltando - aplausosCrie uma função e passe o parâmetro put como do tipo genérico.
fonte
Por favor, tente o código abaixo:
fonte
Eu estava realizando isso em todo o meu código e queria uma maneira de colocá-lo em um método. Eu queria compartilhar isso aqui porque não precisava usar o Convert.ChangeType para o meu valor de retorno. Essa pode não ser uma prática recomendada, mas funcionou para mim. Esse método utiliza uma matriz do tipo genérico e um valor a ser adicionado ao final da matriz. A matriz é copiada com o primeiro valor retirado e o valor obtido no método é adicionado ao final da matriz. A última coisa é que eu retorno a matriz genérica.
fonte