Convertendo valores para tipo genérico. (#csharp #dotnet #dev)

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.

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in .Net, Dev and tagged , , , .