2011-03-28 14 views
8

मैं वैल्यू इंजेक्टर को समझने की कोशिश कर रहा था, इसलिए मैं इसे अपने घर के छोटे ओआरएम में उपयोग कर सकता हूं। चूंकि मुझे डेटारो और डेटाटेबल मैपिंग का समर्थन करना चाहिए, इसलिए मैं इस प्रकार के लिए मैपर लागू करने की कोशिश कर रहा हूं। और ईमानदारी से दस्तावेज पर्याप्त नहीं है और मैं इसे एक शॉट देना चाहता था। शायद ओमू या इस पुस्तकालय के कुछ अन्य उपयोगकर्ता जवाब देंगे।वैल्यू इंजेक्टर और डेटाटेबल

यहाँ मेरी 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); 
      } 
     } 
    } 

इस बहुत अच्छी तरह से काम करता है। तो यहां सवाल यह है कि मैं इसे डेटाटेबल के लिए कैसे कार्यान्वित कर सकता हूं और 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? 
     } 
    } 

मैं इसे कैसे पूरा कर सकता हूं। आप

यहाँ ~~~~~~ पूरा कोड मैं 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

भयानक :), बहुत आसान लग रहा है – Omu

उत्तर

5

ही के रूप में आप यह DataRow के लिए किया था के साथ लिखा है शुक्रिया, आप अभी KnownSourceValueInjection<DataTable> का उपयोग करें।

साथ ही आप Inject विधि void देख सकते हैं, इसलिए आप कुछ भी वापस नहीं लौटते हैं जिसे आप केवल लक्षित ऑब्जेक्ट (जो पहले से मौजूद है) को बदलते हैं।

याद रखें कि InjectFrom नई ऑब्जेक्ट्स नहीं बनाता है, यह किसी मौजूदा मान को इंजेक्ट करता है।

तो आप करने जा रहे हैं:

var list = new List<T>(); 
list.InjectFrom<MyFromDataTableInj>(dataTable) 
अपने मामले में

वास्तव में आप केवल DataTable से IList<T> को यह इंजेक्शन का उपयोग करने के लिए जा रहे हैं, ताकि आप इस तरह कर सकता है:

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

और उपयोग:

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

i इसका मूल्यांकन करेंगे। धन्यवाद। – adt

+0

@adt मैंने इसे थोड़ा सा संपादित किया है – Omu

+0

मैं f5'ing हूं :) रात में कोड होगा और आपको सूचित करेगा। – adt

संबंधित मुद्दे