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

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

Overview

Explorando um pouco mais o mundo da programação C#, hoje trazemos um truque incrivelmente útil: como converter uma variável para um tipo genérico, valendo-se do conceito de generics . Para quem deseja aprimorar suas habilidades no C#, este post vai desde revisar quais classes suportam essa conversão, passando pela mecânica da classe Convert, até uma aplicação prática que ilustra tudo isso em um contexto real de desenvolvimento. Se a ideia é fazer seu código mais eficiente e seu trabalho com tipos genéricos mais intuitivo, então prepare-se, pois as próximas linhas são para você!

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.