2011-03-28 24 views
8

Estaba tratando de descubrir ValueInjecter para poder usarlo en nuestro pequeño ORM de cosecha propia. Como debería soportar el mapeo DataRow y DataTable, estoy tratando de implementar mapeadores para este tipo. Y honestamente, la documentación no es lo suficientemente buena y quería intentarlo. Tal vez Omu u otros usuarios de esta biblioteca respondan.ValueInjecter y DataTable

aquí es mi DataRow inyector

public class DataRowInjection: KnownSourceValueInjection<DataRow> 
    { 
     protected override void Inject(DataRow source, object target) 
     { 
      for (var i = 0; i < source.ItemArray.Count(); i++) 
      { 

       //TODO: Read from attributes or target type 
       var activeTarget = target.GetProps().GetByName(source.Table.Columns[i].ToString(), true); 
       if (activeTarget == null) continue; 

       var value = source.ItemArray[i]; 
       if (value == DBNull.Value) continue; 

       activeTarget.SetValue(target, value); 
      } 
     } 
    } 

esto funciona bastante bien. así que aquí está la pregunta de cómo puedo implementar esto para DataTable y devolver Ienumarable o IList. el fragmento de código que espero hacer es como.

public class DataTableInjector : ????? 
    { 
     protected override void Inject(DataTable source, IList<T> target) where T : class 
     { 

      // Do My Staff 
      foreach (var row in source.Rows) 
      { 
       target[i].InjectFrom<DataRowInjection>(row); 
      } 

      //return IList? 
     } 
    } 

¿Cómo puedo lograr esto. Gracias

~~~~~~ aquí es código completo que he escrito con la ayuda de Omu

public class DataTableInjection<T> : ValueInjection where T : new() 
    { 
     protected override void Inject(object source, object target) 
     { 
      var dt = source as DataTable; 
      var t = target as IList<T>; 

      foreach (DataRow dr in dt.Rows) 
      { 
       var t2 = new T(); 
       t2.InjectFrom<DataRowInjection>(dr); 
       t.Add(t2); 
      } 
     } 
    } 
+2

impresionante :), parece bastante simple – Omu

Respuesta

5

Igual que lo hiciste por DataRow, sólo tiene que utilizar KnownSourceValueInjection<DataTable> ahora.

Además, como puede ver, el método Inject es void, por lo que no devuelve nada, solo cambia el objeto de destino (que ya existe).

Recuerde que InjectFrom no crea objetos nuevos, sino que inyecta valores en uno existente.

por lo que van a tener:

var list = new List<T>(); 
list.InjectFrom<MyFromDataTableInj>(dataTable) 

En realidad, en su caso, usted va a utilizar esta inyección única de DataTable a IList<T> por lo que podría hacer como esto:

public class My<T> : ValueInjection 
    { 
     protected override void Inject(object source, object target) 
     { 
      var dt = source as DataTable; 
      var t = target as IList<T>; 
... 
     } 
    } 

Y uso:

list.InjectFrom<My<Foo>>(datatable): 
+0

i Evaluará esto. gracias. – adt

+0

@adt lo he editado un poco – Omu

+0

estoy f5'ing :) codificará por la noche y le informaré. – adt