2011-03-28 6 views
8

ValueInjecter를 알아 내려고 노력 중이므로 자숙 한 작은 ORM에서 사용할 수 있습니다. 이후 DataRow 및 DataTable 매핑을 지원해야합니다,이 형식에 대한 mappers 구현하려고합니다. 그리고 정직하게도 문서화가 충분하지 않아서 그것을 포기하고 싶었습니다. 어쩌면 Omu 또는이 라이브러리의 다른 사용자가 대답 할 것입니다.ValueInjecter 및 DataTable

여기이 꽤 잘 작동 내 DataRow를 인젝터

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); 
      } 
     } 
    } 

입니다. 그래서 여기에 질문이 어떻게 구현할 수있는 DataTable 및 반환 Ienumarable 또는 IList. 내가 할 것으로 예상 코드 스 니펫은 같습니다.

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? 
     } 
    } 

어떻게해야합니까? 는 지금 KnownSourceValueInjection<DataTable>을 사용하여, 당신은

내가 OMU의 도움이 DataRow 위해했던 것처럼 같은

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

awesome :) 매우 간단합니다. – Omu

답변

5

으로 쓴 전체 코드 여기 ~~~~~~ 감사드립니다.

마찬가지로 Inject 메서드는 void이므로 아무 것도 반환하지 않으므로 대상 개체 (이미 존재하는)를 변경하면됩니다.

InjectFrom은 새 개체를 만들지 않으며 기존 개체에 값을 주입한다는 것을 기억하십시오.

그래서 당신은해야 할 것 :

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

그리고 : 귀하의 경우 실제로

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

당신은 그래서 당신이 이렇게 할 수있는 유일한 DataTable의에서 IList<T> 이 주사를 사용하려고 사용법 :

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

i 이것을 평가할 것입니다. 고맙습니다. – adt

+0

@adt 편집했습니다. – Omu

+0

밤에 코드를 작성하고 알려 드리겠습니다. – adt