2009-09-09 20 views
15

Necesito reutilizar un método de DataAccess prescrito por el cliente. Este método devuelve una tabla de datos vainilla. Quiero transmitir esta tabla de datos a mi tabla de datos Typed. La cantidad de columnas y sus tipos coincidirán. El mensaje de excepción "No se puede convertir el objeto del tipo 'System.Data.DataTable' para escribir 'MarketValueDataTable'." es muy claro, pero ¿cómo lo soluciono?Casting datatable genérico a datatable type

Echa un vistazo a casting-a-base-type-to-a-derived-type, pero no pude ver cómo hacerlo funcionar.

No puedo llenar la tabla de datos con un lector de datos, solo puedo usar el método DataAccess del cliente.

Respuesta

32

El reparto sólo podía funcionar si la tabla devuelta por el método era en realidad una instancia de MarketValueDataTable. Si no es así, todo lo que puede hacer es copiar los datos en una instancia de MarketValueDataTable. Se podría, por ejemplo, utiliza el método Merge:

DataTable data = GetData(); 
MarketValueDataTable myData = new MarketValueDataTable(); 
myData.Merge(data); 
+0

I SO luv! Gracias. – callisto

+0

Muy bien ... :) – Marshal

+0

¿Cuáles son los costos de la fusión? – deepdive

1

No puede convertir DataTable a MarketValueDataTable, por la sencilla razón de que no hereda de él.

Lo que necesita hacer es crear una nueva instancia de MarketValueDataTable, luego copiar los datos de DataTable en ella.

intentar algo como:

MarketValueDataTable myTable = new MarketValueDataTable(); 
StringWriter writer = new StringWriter(); 
theDataTable.WriteXml(writer); 
myTable.ReadXml(new StringReader(writer.ToString())); 

(no he probado esto)

0

Si su tabla de datos es una tabla genérica, entonces no se puede convertir a un MarketValueDataTable.

Una cosa que puedes intentar es crear un nuevo objeto MarketValueDataTable y agregarle filas manualmente. Al avanzar por las filas de su tabla de datos genéricos y luego al recorrer las columnas de cada fila, puede usar el reflejo para establecer los valores de las propiedades de una nueva MarketValueDataTableRow.

algo como lo siguiente (advertencia - pseudocódigo):

MarketValueDataTable mv = new MarketValueDataTable(); 
foreach(DataRow row in table.Rows) 
{ 

    MarketValueDataTableRow mvrow = mv.NewRow(); 
    foreach(DataColumn col in table.Columns) 
    { 
     PropertyInfo colProperty = mvrow.GetType().GetProperty(col.Name); 
     colProperty.SetValue(mvRow, row[col]); 
    } 
    mv.Rows.Add(mvrow); 

} 

se entiende la idea general. Paso a través de las filas de la tabla genérica y utilice la reflexión para encontrar las propiedades coincidentes en la fila específica de datos escritos. Esto debería funcionar (he usado el mismo enfoque anteriormente), pero el código debe modificarse para que coincida con sus requisitos.

7

Utilice esta útil función para convertir un DataTable normal en un DataTable mecanografiado.

VB

Public Shared Function ConvertToTypedDataTable(Of T As {Data.DataTable, New})(dtBase As Data.DataTable) As T 
    Dim dtTyped As New T 
    dtTyped.Merge(dtBase) 

    Return dtTyped 
End Function 

Uso

Dim dtTyped = ConvertToTypedDataTable(Of dataset1.MyTypedDataTable)(MyUntypedDataTable) 

C#

public static T ConvertToTypedDataTable<T>(System.Data.DataTable dtBase) where T : Data.DataTable, new() 
{ 
    T dtTyped = new T(); 
    dtTyped.Merge(dtBase); 

    return dtTyped; 
} 

Uso

dataset1.MyTypedDataTable dtTyped = ConvertToTypedDataTable<dataset1.MyTypedDataTable>(MyUntypedDataTable);