2012-05-24 38 views
38

Estoy tratando de convertir un objeto (se declara aquí como 'obj': objeto es array, primitivo) a una matriz de cadenas.object to string array

objeto puede ser cualquier cosa uint [], Int16 [], etc.

he estado tratando de utilizar

string[] str = Array.ConvertAll<object, string>((object[])obj, Convert.ToString); 

El problema se produce cuando trato de convertir el objeto de tipo desconocido en objeto [ ] He estado obteniendo un error de lanzamiento.

Un intento que hice, que fracasó, estaba usando

object[] arr = (object[])obj; 

o

IEnumerable<object> list = obj as IEnumerable<object> 
object[] arr = (object[])list; 

vi publicaciones con respecto al tipo de valor y tipo de referencia en el tema de fundición.

¿Habría un código simple que pueda manejar la conversión al objeto [] independientemente del tipo de objeto, siempre que sea una matriz? Estoy tratando de evitar el manejo manual de todos los tipos de fundición posibles.

gracias de antemano

+1

no se puede echar las matrices de los tipos de valor para 'object []', no son compatibles. –

Respuesta

62

Puede utilizar el hecho de que cada conjunto implementa IEnumerable:

string[] arr = ((IEnumerable)obj).Cast<object>() 
           .Select(x => x.ToString()) 
           .ToArray(); 

Esto se casilla primitivas adecuadamente, antes de convertirlos en cadenas.

La razón falla el elenco es que a pesar de las matrices de referencia tipos son covariantes, las matrices de valor tipos no son:

object[] x = new string[10]; // Fine 
object[] y = new int[10]; // Fails 

La conversión a solo IEnumerable funcionará sin embargo. Diablos, podrías lanzar al Array si quisieras.

+0

¿Por qué hay una necesidad de primitivas de caja? – Douglas

+0

@Douglas: Porque no se puede convertir una matriz de tipos primitivos en 'object []', y no conocemos el tipo de antemano. –

+0

Funciona incluso sin conversión a 'IEnumerable', ¿por qué quieres echarle esplicity? – Tigran

10

Si siempre es una colección de algún tipo (matriz, lista, etc ...) y luego lanzarlo de nuevo a viejo y simple System.Collections.IEnumerable e ir de allí

string[] str = ((System.Collections.IEnumerable)obj) 
    .Cast<object>() 
    .Select(x => x.ToString()) 
    .ToArray(); 

Aquí es una aplicación más a fondo que maneja no -collections así

static string[] ToStringArray(object arg) { 
    var collection = arg as System.Collections.IEnumerable; 
    if (collection != null) { 
    return collection 
     .Cast<object>() 
     .Select(x => x.ToString()) 
     .ToArray(); 
    } 

    if (arg == null) { 
    return new string[] { }; 
    } 

    return new string[] { arg.ToString() }; 
} 
+0

gracias, funciona muy bien –

-1

mi ejemplo:

public class TestObject 
    { 
     public string Property1 { get; set; } 

     public string Property2 { get; set; } 

     public string Property3 { get; set; } 
    } 



    static void Main(string[] args) 
    { 
     List<TestObject> testObjectList = new List<TestObject> 
     { 
      new TestObject() { Property1 = "1", Property2 = "2", Property3 = "3" }, 
      new TestObject() { Property1 = "1", Property2 = "2", Property3 = "3" }, 
      new TestObject() { Property1 = "1", Property2 = "2", Property3 = "3" } 
     }; 

     List<string[]> convertedTestObjectList = testObjectList.Select(x => new string[] { x.Property1, x.Property2, x.Property3 }).ToList(); 
    }