2009-03-01 14 views
22

सूचकांक के लिए एक्सटेंशन तरीके, क्या वे अच्छे होंगे?इंडेक्सर्स के लिए एक्सटेंशन तरीके, क्या वे अच्छे होंगे?

मैं कुछ कोड के साथ खेल रहा था जो पीओसीओ को फिर से हाइड्रेट करता है।

कोड एसक्लडाटा रीडर से लौटाई गई पंक्तियों के आसपास पुनरावृत्त करता है और कॉलम मानों से गुणों को असाइन करने के लिए प्रतिबिंब का उपयोग करता है। मेरे कॉल स्टैक के नीचे मेरे पास एक कोड था: -

poco.Set("Surname", "Smith"); // uses extension method ... 

सेट विधि को एक्सटेंशन विधि के रूप में लिखा गया था।

यह बहुत अच्छा होगा इस

poco["Surname"] = "Smith"; // extension methods for indexers ? 

यानी मैं इंडेक्सर के लिए एक विस्तार विधि

वहाँ अच्छा कारण नेट विस्तार विधियां नहीं हैं लिखना चाहते थे की तरह कोड लिखने में सक्षम किया गया है सूचकांक के लिए? क्या अन्य लोगों के पास विस्तार विधि अनुक्रमणकों के लिए अन्य अच्छे उपयोग हैं?

एक अलग रूप में के रूप में ... हम indexers के लिए विस्तार तरीकों तो हम इस तरह कोड लिख सकता है लिख सकता है ...

var poco = PocoFactory(); 
    poco.Surname = “Smith”; // is this JavaScript ... 
    poco[Surname] = “Smith” ; // … or is this c# or both 

मेरे कोड से कुछ के टुकड़े

///////////////////////////////////////////// 
// Client calling code 
IDab dab = DabFactory.Create("Northwind"); 
string sql = @"select * from Customers "; 
var persons = dab.ExecuteReader<NorthwindCustomer>(sql); 
if (dab != null{ 
    Assert.That(persons[0].CustomerID , Is.EqualTo("ALFKI"));} 
///////////////////////////////////////////// 
List<T> IDab.ExecuteReader<T>(string commandText) 
{ 
    List<T> pocos = new List<T>(); 
    // setup connection 
    SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection); 
    while (reader.Read()) 
    { 
      Dictionary<string, int> colMappings = null ; 
      if (colMappings == null){ 
       colMappings = reader.GetSqlDataReaderColumnMappings();} 
      T poco = new T(); 
      poco.DbToMem<T>(reader, colMappings); 
      pocos.Add(poco); 
     } 
    } 
    // connection cleanup ... 
    return pocos ; 
} 

// the set extension method signature 
public static void Set<T>(this T thisClientObject, string thisPropertyName, object newValue) where T : class 

उत्तर

11

Indexers एक बहुत का हिस्सा गुणों के साथ समानता (हुड के नीचे, एक सूचकांक एक अनुक्रमणिका के साथ एक संपत्ति है), और विस्तार गुण मौजूद नहीं हैं। सहमत हैं, ऐसे परिदृश्य होंगे जहां वे काम कर रहे हैं।

परिदृश्य प्रस्तुत करें - कुछ मायनों में, यह dynamic जैसा है। बेशक, अगर आप एक अंतरफलक है कि है एक स्ट्रिंग इंडेक्सर घोषित, तो अपने पाठक-कोड यह सीधे इस्तेमाल कर सकते हैं - लेकिन यह इस इंटरफेस बार-बार लागू करने के लिए अनावश्यक काम का एक बहुत होगा!

विस्तार विधि पुन: प्रयास करें; क्या यह नियमित प्रतिबिंब का उपयोग करता है? आप HyperDescriptor की तरह चालें, जो CPU बहुत समय की बचत हो सकती है अगर आप इस के बहुत से कर रहे हैं को देखने के लिए चाहते हो सकता है। विशिष्ट उपयोग तो होगा:

PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T)); 
while (reader.Read()) 
{ 
    T poco = new T(); 
    // abbreviated... 
    (per prop) 
     props[propName].SetValue(poco, cellValue); 
} 

आप आगे (एक बार प्रति ग्रिड, प्रति पंक्ति नहीं) लौटे कॉलम पहले को देख, और केवल मिलान किया कॉलम तक पहुंच कर इस अनुकूलन कर सकते हैं ...

या वैकल्पिक रूप से, ओआरएम उपकरण देखें; Expression का उपयोग डेटा पढ़ने के लिए भी किया जा सकता है (मेरे पास यूबीनेट पर कहीं भी इसका पूरा उदाहरण है, डीबीएलएनक्यू के लिए)

+0

दिलचस्प धन्यवाद, मैं एक नज़र होगा। – judek

-1

पॉकोस को पुनः हाइड्रेट करने के लिए, मैं ऑटोमैपर Nuget पैकेज को देखने की सलाह दूंगा। यह वास्तव में आसान है और बहुत कोड की मात्रा को कम कर देता है।

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