Convertir objeto a estructura con genéricos

Estoy buscando una manera de convertir un objeto en uno de varios tipos diferentes de estructuras. Necesito estructuras porque necesito que no sea anulable. No estoy seguro de cómo hacerlo, pero esto es lo que he intentado hasta ahora y no funciona porque: "El objeto debe implementar IConvertible". <- probando Convert.ChangeType

public class Something
{
    private object[] things;

    public Something()
    {
        //I don't know at compile time if this will
        //be an array of ThingA's or ThingB's
        things = new object[1];

        things[0] = new ThingA();
        ThingA[] thingsArrayA = GetArrayofThings<ThingA>();

        things[0] = new ThingB();
        ThingB[] thingsArrayB = GetArrayofThings<ThingB>();
    }

    public TData[] GetArrayofThings<TData>() where TData : struct
    {
        return (TData[])Convert.ChangeType(things, typeof(TData[]));
    }
}

[Serializable]
public struct ThingA
{
    //...
}

[Serializable]
public struct ThingB
{
    //...
}

Esta es la implementación de trabajo gracias a la respuesta de Serg:

    public TData[] GetArrayofThings<TData>() where TData: struct
    {
        return things.OfType<TData>().ToArray<TData>();
    }

Todavía tengo curiosidad acerca de las penalizaciones por .ToArray() porque estos son datos que se enviarán a un objeto de flujo, y podría haber muchos.

preguntado el 27 de julio de 12 a las 19:07

¿Por qué necesita que sea no anulable? ¿En que contexto? Esto parece mucho trabajo sin razón aparente (pero podría estar ciego). -

¿Qué es exactamente lo que estás tratando de lograr aquí? ¿Por qué necesitarías que los objetos no sean anulables? Además, no creo que entiendas completamente lo que estás tratando de hacer aquí. No puede simplemente convertir un objeto en una estructura sobre la marcha. Debe definir una estructura y alguna forma de conversión entre sus clases y la estructura, ya sea un método o una conversión definida por el usuario. -

2 Respuestas

Me parece que algunas consultas LINQ serán suficientes.

//getting only ThingA from mixed array
IEnumerable<ThingA> thingsA = things.OfType<ThingsA>()
//we know type of thins inside array, so we just need type conversion
IEnumerable<ThingB> thingsB = things.Cast<ThingB>()

No use Convert, es real conversión (p.ej, string a int), y lo que tienes es tipo de fundición.

Respondido 27 Jul 12, 19:07

Esto me está acercando. Para usar el IEnumerable como parámetro no anulable para un objeto de flujo, necesito hacer algo como esto: thingsA.ToArray (); ¿Esto incurrirá en muchos gastos generales? - Congelado

ChangeType la firma del método expone dos parámetros, el primero: value debe ser un objeto que implemente la interfaz IConvertible. en tu ejemplo things es un object matriz y no implementa esa interfaz. Debe diseñar su método GetArrayOfThings de una manera diferente como esta:

public TData[] GetArrayofThings() donde TObject:IConvertible, TData: struct

Respondido 27 Jul 12, 19:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.