2009-12-16 9 views
8

La siguiente función acepta un objeto, que a veces puede ser una matriz de un tipo determinado. En este caso, supongo que el tipo podría determinarse con obj [0] .GetType(), suponiendo que la matriz tiene al menos un miembro. Me gustaría convertir una matriz de este tipo a una lista genérica <T> del tipo apropiado, pero el siguiente código solo tiene éxito al convertir a la lista <objeto>. ¿Cómo puede hacerse esto?Convertir matriz de cualquier tipo a List <T> (C#)

 
     public object GetDeserializedObject(object obj, Type targetType) 
     { 
      if (obj is Array) 
      { 
       List<object> obj2 = new List<object>(); 
       for (int i = 0; i < ((Array)obj).Length; i++) 
       { 
        obj2.Add(((object[])obj)[i]); 
       } 
       obj = obj2; 
      } 
      return obj; 
     } 

Tenga en cuenta que GetSerializedObject() implementa una función que pertenece a la interfaz IDataContractSurrogate, así que no creo que pueda cambiar su firma como se muestra.

Respuesta

16

Suponiendo que no se conoce el tipo en tiempo de compilación, que' Quiero crear un método genérico para hacerlo y luego llamarlo por reflexión. Por ejemplo:

private static List<T> ConvertArray<T>(Array input) 
{ 
    return input.Cast<T>().ToList(); // Using LINQ for simplicity 
} 

public static object GetDeserializedObject(object obj, Type targetType) 
{ 
    if (obj is Array) 
    { 
     MethodInfo convertMethod = typeof(...).GetMethod("ConvertArray", 
      BindingFlags.NonPublic | BindingFlags.Static); 
     MethodInfo generic = convertMethod.MakeGenericMethod(new[] {targetType}); 
     return generic.Invoke(null, new object[] { obj }); 
    } 
    return obj; 
} 

(Si hace conocer el tipo en tiempo de compilación, simplemente que sea un método genérico y llamar Cast y ToList directamente.)

+2

¿Qué pertenece en lugar del "..."? –

+1

@nw: La clase en la que coloca el método 'ConvertArray' que Jon definió en. Es decir, si coloca el método' ConvertArray' en una clase llamada 'ArrayConverter', entonces reemplace''E' con 'ArrayConverter'. – jason

+1

@Jon: 'TargetType' debe ser' Type'. – jason

3

Prueba el moldeada() método de LINQ:

public object GetDeserializedObject<T>(object obj) 
    { 
     if (obj is Array) 
     { 
      var list = ((Array)obj).Cast<T>().ToList(); 
      obj = list; 
     } 
     return obj; 
    } 

Y deberá especificar el tipo que desea en T.

+1

que iba a ir a una dirección completamente diferente , pero esto es mucho más elegante. – rossipedia

+2

GetSerializedObject() implementa una función que pertenece a la interfaz IDataContractSurrogate, por lo que no creo que pueda cambiar su firma como se muestra. –

Cuestiones relacionadas