c# - una - importancia de la cadena de valor pdf
objetar a la matriz de cadena (3)
Estoy tratando de convertir un objeto (se declara aquí como ''obj'': objeto es matriz, primitivo) a una matriz de cadenas.
objeto puede ser cualquier cosa [], int16 [], etc.
He estado tratando de usar
string[] str = Array.ConvertAll<object, string>((object[])obj, Convert.ToString);
El problema ocurre cuando trato de convertir el objeto tipo desconocido en objeto []. He estado recibiendo un error de lanzamiento.
Un intento que hice, que falló, estaba usando
object[] arr = (object[])obj;
o
IEnumerable<object> list = obj as IEnumerable<object>
object[] arr = (object[])list;
Vi publicaciones sobre el tipo de valor y el problema del tipo de referencia en el casting.
¿Habría un código simple que pueda manejar la conversión al objeto [] independientemente del tipo de objeto, siempre que sea una matriz? Intento evitar el manejo manual de todos los tipos posibles de conversión.
gracias por adelantado
Puede usar el hecho de que cada matriz implementa IEnumerable
:
string[] arr = ((IEnumerable)obj).Cast<object>()
.Select(x => x.ToString())
.ToArray();
Esto encapsulará las primitivas de manera apropiada, antes de convertirlas en cadenas.
La razón por la que falla el reparto es que aunque las matrices de tipos de referencia son covariantes, las matrices de tipos de valores no son:
object[] x = new string[10]; // Fine
object[] y = new int[10]; // Fails
IEnumerable
embargo, solo funcionará con IEnumerable
. Diablos, podrías lanzar a Array
si quisieras.
Si siempre es una colección de algún tipo (matriz, lista, etc.), intente volver al viejo System.Collections.IEnumerable
y vaya desde allí.
string[] str = ((System.Collections.IEnumerable)obj)
.Cast<object>()
.Select(x => x.ToString())
.ToArray();
Aquí hay una implementación más completa que también maneja no colecciones
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() };
}
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();
}