5 extensiones para el ecosistema .NET

Table of Contents

Estas son 5 extensiones que normalmente todos deberíamos tener en nuestros proyectos, principalmente cuando trabajamos en proyectos que irán evolucionando con el tiempo. Estas extensiones, las usamos internamente y normalmente las reutilizamos en casi todos los proyectos.

Tengo muchas extensiones y helpers que podría compartir, incluso de librerías muy conocidas, y sé que a muchos de ustedes les puedes ayudar en su día a día, si no las han agregado ya. Por el momento estaré compartiendo estas, y dependiendo del apoyo estaré compartiendo otras más.

Manténganse atentos en @luismatosluna

Extensiones

DateTimeToString

En esta ocasión, les traigo dos (2) extensiones en vez de una (1).

La primera extensión convierte un tipo de datos DateTime a texto, pero mencionando si hace que tiempo (días, meses, años) está la fecha en relación con la fecha actual. Esta extensión es especialmente útil cuando se trabaja con un feed de noticias o una lista de artículos y se quiere mostrar al usuario cuando se publicó dicho artículo.

...
        public static string DateTimeToString(this DateTime value)
        {
            if (value == null)
                return string.Empty;

            if (value.Date == DateTime.Now.Date)
                return "Today";

            var numDays = (DateTime.Now.Date - value.Date).Days;
            if (numDays > 0 && numDays < 8)
            {
                if (numDays == 1)
                    return "Yesterday";
                else
                    return value.DayOfWeek.ToString();
            }

            if (numDays > 8 && numDays < 30)
            {
                return "One month ago";
            }


            if (numDays < 365)
            {
                return numDays + " days ago";
            }
            else
            {
                int years = numDays / 365;
                return (years == 1)? years + " year ago" : years + " years ago";
            }
        }
...

// USE:
var date = new DateTime(2020, 5, 1, 8, 30, 52);
Console.WriteLine(date.DateTimeToString());

// OUTPUT:
2 years ago

La segunda extensión es muy similar a la primera, pero en este caso solo devuelve en texto si fue ‘Hoy’ o ‘Ayer’, en caso contrario devolverá en texto le fecha. Esta extensión se suele utilizar igual en feed de noticias, pero es un poco más simple, definida y minimalista para el usuario final.

...
        public static string DateTimeToString2(this DateTime value)
        {
            if (value == null)
                return string.Empty;

            if (value.Date == DateTime.Now.Date)
                return "Today";

            var numDays = (DateTime.Now.Date - value.Date).Days;
            if (numDays > 0 && numDays < 8)
            {
                if (numDays == 1)
                    return "Yesterday";
                else
                    return value.DayOfWeek.ToString();
            }

            return value.ToString("MMM dd, yyyy").ToUpper();
        }
...

// USE:
var date = new DateTime(2020, 5, 1, 8, 30, 52);
Console.WriteLine(date.DateTimeToString2());

// OUTPUT:
MAY 1, 2020

JustNumberFormat

Esta extensión es muy simple pero poderosa. Con esta extensión eliminas todos los caracteres de una cadena de texto que no sean numéricos. Muy útil para cuando quieras obtener el número de teléfono limpio de caracteres, por ejemplo.

...
        public static string JustNumberFormat(this string value)
        {
            return string.Join("", value.ToCharArray().Where(Char.IsDigit));
        }
...

// USE:
string phone = "+1 (712) 412-5236";
Console.WriteLine(phone.JustNumberFormat());

// OUTPUT:
17124125236

ValidateEmail

Probablemente, estés usando una librería o tengas tu propia librería para validar los correos electrónicos, pero si bien es cierto, hacerlo con una extensión es mucho más limpio. Con esta extensión podrás validar los correos electrónicos de manera sencilla y fácil.

...
    public static bool ValidateEmail(this string value)
    {
            if (value == null)
            {
                return false;
            }

            if (!(value is string valueAsString))
            {
                return false;
            }

            // only return true if there is only 1 '@' character
            // and it is neither the first nor the last character
            int index = valueAsString.IndexOf('@');

            return
                index > 0 &&
                index != valueAsString.Length - 1 &&
                index == valueAsString.LastIndexOf('@');
    }
...

// USE:
string email1= "myemail.com";
Console.WriteLine(email1.ValidateEmail());

string email2= "myemail@server.com";
Console.WriteLine(email2.ValidateEmail());

// OUTPUT:
false
true

RunSafe

Esta extensión es maravillosa. Cuando necesites correr una tarea de manera segura lo puedes hacer con esta extensión y dejar escribir tus bloques try {} catch {}.

...
	public static async Task RunSafe(this Task task, Action<Exception> onError = null, CancellationToken token = default(CancellationToken))
	{
		Exception exception = null;

		try
		{
			if (!token.IsCancellationRequested)
			{
				await Task.Run(() => {
					task.Start();
					task.Wait();
				});
			}
		}
		catch (TaskCanceledException)
		{
			Console.WriteLine("Task Cancelled"); 
		}
		catch (AggregateException e)
		{
			var ex = e.InnerException;
			while (ex.InnerException != null)
				ex = ex.InnerException;
				exception = ex;
		}
		catch (Exception e)
		{
			exception = e;
		}
		finally
		{
			//AfterTaskRun?.Invoke(null, task);
		}

		if (exception != null)
		{
			//TODO: Log to Insights
			Console.WriteLine(exception); 
			onError?.Invoke(exception);
		}
	}
...

// USE:
var task = new Task(() => { Console.WriteLine("Hi!"); });
await task.RunSafe(() => Console.WriteLine("An error occured!"));

// OUTPUT:
Hi!

Conclusión

Espero que estas extensiones les sea de utilidad. Y también porque no, compartan sus extensiones en las redes. Me pueden etiquetar a @luismatosluna en twitter.

Si este artículo tiene mucho apoyo, les estaré compartiendo algunas extensiones de Xamarin.Forms, .NET MAUI, y mucho más. Nos vemos en la próxima.

Share this content!

Facebook
Twitter
LinkedIn
Telegram
WhatsApp