Abaixo mostro como converter uma variável qualquer para um tipo genérico (generics <T>).
Antes de começar, vale lembrar que o método que vou mostrar aqui funciona apenas para classes que implementam a interface IConvertible. Até o momento da criação deste post, as seguintes classes implementam ele nativamente:
- System.Boolean
- System.Byte
- System.Char
- System.DateTime
- System.DBNull
- System.Decimal
- System.Double
- System.Enum
- System.Int16
- System.Int32
- System.Int64
- System.SByte
- System.Single
- System.String
- System.UInt16
- System.UInt32
- System.UInt64
A conversão é bem simples, basta utilizar a classe Convert:
using System; ... var converted = (T)Convert.ChangeType(originalValue, typeof(T));
Aproveitando o embalo do ultimo post, abaixo está o exemplo aplicado a um método de extensão de HttpRequest:
public static class HttpRequestExtensions { /// <summary> /// Tries to extract a value from the request header. /// If the key is not found, will return default value for the required type. /// </summary> /// <param name="req">Http request</param> /// <param name="key">header key</param> /// <param name="defaultValue">default value to be returned when the key is not found</param> /// <typeparam name="T">return type</typeparam> /// <returns>extracted (or default) value</returns> public static T GetParsedHeader<T>(this HttpRequest req, string key, T defaultValue = default) { return req.Headers.TryGetValue(key, out var value) ? (T) Convert.ChangeType(value.ToString(), typeof(T)) : defaultValue; }
No método acima, tento extrair e converter o valor. Se não der certo, ou seja, se a chave não existir no header, será retornado o valor padrão (default) do tipo informado (T). Talvez fosse melhor lançar uma exception, mas isso vai variar de acordo com a necessidade.
Ainda sobre a implementação acima, faço a conversão do valor para string (value.ToString()), pois o valor retornado pelo TryGetValue é um StringValue e ele não implementa IConvertible, mas string implementa.
Espero ter ajudado.
Latest posts by Breno RdV (see all)
- O que é Metaclass e como ela funciona. (#python #dev #metaclass) - janeiro 11, 2023
- Entenda a mágica dos Generators. (#python, #dev, #generator, #iterator) - dezembro 28, 2022
- Ordenando um DataFrame por múltiplas colunas. (#python #pandas #jupyter #dev #data) - agosto 3, 2022