2010-02-05 9 views
6

Estoy teniendo un error mental al intentar hacer que el siguiente método sea más genérico, de modo que cualquier List<T> se puede pasar para el parámetro columnValues. Aquí es lo que tengo:¿Cómo puedo hacer que este método de extensión sea más genérico?

public static DataRow NewRow(this DataTable dataTable, List<string> columnValues) 
{ 
    DataRow returnValue = dataTable.NewRow(); 

    while (columnValues.Count > returnValue.Table.Columns.Count) 
    { 
     returnValue.Table.Columns.Add(); 
    } 

    returnValue.ItemArray = columnValues.ToArray(); 
    return returnValue; 
} 

que podría cambiar a un List<object> y convertir la lista original antes de pasarlo al método, pero estoy seguro de que hay una mejor opción :-)

Editar :

La publicación de Frank me hizo replantear esto. En la mayoría de los casos, la fuente List<T> sería List<object>, ya que los valores de las columnas probablemente sean de tipos diferentes.

Para mi uso inicial, un List<string> tiene sentido porque estaba creando un conjunto de datos de un análisis CSV que es todo el texto en ese punto.

Respuesta

4

que está básicamente fuera de suerte, ya que el elemento del array de DataRow es una matriz de objetos, es decir, en última instancia, se puede solo pasa en la lista de objetos.

Si coloca un parámetro genérico de la lista, todos los elementos de la lista deberían ser de ese tipo, lo cual es muy poco probable que sea útil.

Una vez dicho esto, con el fin de obtener numerosas columnas, todas con diferentes tipos, que podría cambiar su método de extensión para aceptar un objeto en el que se instancia un tipo anónimo:

table.NewRow(new { A = "Hello", B = 1, C = DateTime.Now }) 

Con la ayuda de convertir el tipo anónimo valora a una cadena, diccionario de objetos ya sea by reflection or by a dynamic method, debería ser algo bastante útil.

+0

Lol eres punto es excelente y no lo había considerado. Para mi uso inicial, una lista tenía sentido porque estaba creando un conjunto de datos de un análisis CSV, que es todo el texto en ese punto. Para la mayoría de los otros usos, esto no tendría sentido, ya que los valores de columna probablemente sean tipos diferentes. –

2

¿Qué hay de

IEnumerable<object> 

en conexión con

columnValues.Select(x => x.ToString()).ToArray(); 
5

Por qué no sólo tiene que utilizar params object[]:

public static DataRow NewRow(this DataTable dataTable, params object[] objects) 
{ 
    DataRow returnValue = dataTable.NewRow(); 

    while (objects.Length > returnValue.Table.Columns.Count) 
    { 
     returnValue.Table.Columns.Add(); 
    } 

    returnValue.ItemArray = objects; 
    return returnValue; 
} 

continuación, sólo puede llamar así:

myDataTable.NewRow(1,2,"hello"); 
1

¿Qué pasa con el uso de un cierre para especificar cómo generar el ItemArray en base a su tipo de entrada

public static DataRow NewRow<T>(this DataTable dataTable, List<T> columnValues, Func<T, string> itemArrayCriteria) 
{ 
    DataRow returnValue = dataTable.NewRow(); 

    while (columnValues.Count > returnValue.Table.Columns.Count) 
    { 
     returnValue.Table.Columns.Add(); 
    } 

    returnValue.ItemArray = columnValues.Select(x => itemArrayCriteria(x)).ToArray(); 
    return returnValue; 
} 
Cuestiones relacionadas