Conversion de arrays sin cast directo con C#

Realizar casting entre clases es siempre sencillo, el inconveniente es cuando se trata de un arrays. Por ejemplo… sabiendo que la clase Manager deriva de Employee, si tenemos un array de Manager, es fácil convertirlo en un array de Employee usando casting directo:

Employee[] employees1 = (Employee[])managers;

Pero si tenemos un array de Employee no es posible convertirlo en  un array de Manager de la misma forma que tampoco podríamos hacer un casting directo entre objetos simples. No se me ocurre razón cuerda para querer hacer tal cosa, pero otro ejemplo más cotidiano puede ser cuando intentamos mostrar el contenido de un array en una línea usando String.Join, nos daremos cuenta que tiene que ser String[]. Existen muchas situaciones donde no hay un casting directo.

[more]

Afortunadamente disponemos del método genérico Array.ConvertAll<,> y del delegado genérico Converter<,> que nos pueden ayudar a simplificar estas cosas:

// Primero definimos como se convierte una clase en la otra
Converter<Employee, String> Employee2String = delegate(Employee m) { return m.Name; };
 
// Después convertimos todos los elementos del array usando ese delgado
String[] sArray = Array.ConvertAll<Employee,String>(Employees,Employee2String);

Ó podemos hacerlo en una sola línea aprovechando la inferencia de tipos:

String[] sArray = Array.ConvertAll<Employee,String>(Employees,delegate(Employee m) { return m.Name; });

 

Conversion de arrays sin cast directo con C# | vtortola.NET

2 comentarios en “Conversion de arrays sin cast directo con C#”

  1. Y no seria mas facil algo tal que:

    String[] sArray = Array.Select(m => m.name).ToArray();

    En el primer caso, yo tampoco veo por que habria que hacerlo, pero de tener que hacerlo:

    Manager[] mArray = Array.Cast().ToArray();

    El .ToArray() final es porque tanto el .Select como el .Cast<> devuelven IEnumerable<>

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *