¿Cómo se crea un método que convierte una DataRowCollection a una matriz de objetos de un tipo genérico en C #?
Pregunta
Estoy intentando crear un método que toma un DataTable o una DataRowCollection y la convierte en una matriz de un tipo genérico. Algo como esto:
public static T[] ConvertToArray<T>(DataTable dataTable)
{
List<T> result = new List<T>();
foreach (DataRow dataRow in dataTable.Rows)
result.Add((T)dataRow);
return result.ToArray();
}
El problema es esta línea
result.Add((T)dataRow);
que da lata no convertir System.Data.DataRow a T.
Si hago lo mismo sin necesidad de utilizar un tipo genérico, y asegurarse de la clase de los objetos tienen un operador de conversión personalizado definido, el código funciona bien.
Así que la pregunta ahora es, ¿cómo puedo sacar esto de la utilización de los genéricos?
Solución
Se podría utilizar un objeto que proporciona la conversión en un DataRow a su tipo:
public interface IDataRowConverter<T>
{
T Convert(DataRow row);
}
Proporcionar su convertidor de encargo a su función:
public static T[] ConvertToArray<T>(DataTable dataTable, IDataRowConverter<T> converter)
{
List<T> result = new List<T>();
foreach (DataRow dataRow in dataTable.Rows)
result.Add(converter.Convert(dataRow));
return result.ToArray();
}
A continuación, implementa la interfaz necesaria para su tipo:
public class MyObjectDataRowConverter : IDataRowConverter<MyObject>
{
public MyObject Convert(DataRow row)
{
MyObject myObject = new MyObject();
// Initialize object using the row instance
return myObject;
}
}
A continuación, puede llamar a su función utilizando este código:
MyObject[] objectArray =
ConvertToArray<MyObject>(datatable, new MyObjectDataRowConverter());