2009-04-02 27 views
7

मुझे एक इन-हाउस डेटा एक्सेस लाइब्रेरी का उपयोग करने के साथ जोड़ा गया है जो प्रभावी रूप से संग्रहीत प्रक्रिया में एक्सएमएल पास किया जाता है, जो एक्सएमएल देता है। इसके बारे में कुछ भी नहीं है। मैंने ActiveRecord को अनुमोदित करने का प्रयास किया, लेकिन मेरा अनुरोध अस्वीकार कर दिया गया था। हालांकि, http://blog.bodurov.com/Post.aspx?postID=27 पर दिए गए उत्कृष्ट कोड का उपयोग करके, मैंने आईनेमरेबल के लिए एक एक्सटेंशन विधि जोड़ा जो कि रगड़ वाले एक्सएमएल से किए गए कुंजी-मूल्य जोड़े को दृढ़ता से टाइप की गई वस्तुओं में वापस आती है, संपत्ति नामों के साथ पूर्ण होती है!मैं रनटाइम पर गतिशील रूप से बनाए गए सी # प्रकार के लिए विधि कैसे संलग्न करूं?

यह:

dict["keyName1"] 

MyObject.keyName1 

अब इंटरफ़ेस डेटा बाइंडिंग का समर्थन करता है बन जाता है! बहुत अच्छा! हालांकि, मैं इसे एक कदम आगे ले जाना चाहता हूं। मैं चाहता हूं कि वस्तुओं को सेव() विधियों के लिए उत्सर्जित किया जाए, ताकि मैं ActiveRecord पैटर्न को एप कर सकूं और ASP.net से उपयोग करने के लिए अपने वेब लोगों को सहज ज्ञान युक्त ऑब्जेक्ट परत प्रदान कर सकूं।

मैं विजुअल स्टूडियो में स्रोत कोड में एक विधि कैसे लिखूं, और इसे उत्सर्जित वस्तुओं पर रनटाइम पर संलग्न करूं? मुझे असेंबली या आईएल लिखने में दिलचस्पी नहीं है (या इसके लिए योग्य)। मैं इसे सी # में करना चाहता हूं। यह मेरा पहला स्टैक ओवरफ्लो प्रश्न है और मैं इसे कंपनी-अनिवार्य आईई 6 के साथ पोस्ट कर रहा हूं, इसलिए कृपया नम्र रहें।

उत्तर

2

जो मैं उस लेख पर एकत्र करता हूं, उससे आपके लिए अज्ञात प्रकार बना रहे हैं, और आप इसका उपयोग मूल्यों को प्राप्त करने के लिए कर रहे हैं। यदि ऐसा है, तो उन वस्तुओं पर विधियों को जोड़ने का कोई आसान तरीका नहीं है। हालांकि, यदि एसपी निष्पादित हर बार एक्सएमएल संरचना समान होगी, तो एक ठोस वर्ग क्यों न बनाएं जिसमें आपके पास आवश्यक सभी गुण हों, और उन वस्तुओं के संग्रह को स्वयं XML के साथ पॉप्युलेट करें। इस तरह, आप आसानी से किसी भी तरीकों आप कक्षा में सीधे जरूरत है ... जोड़ सकते हैं

संपादित करें:,

वहाँ कोड में जब आप का निर्माण कर रहे: टिप्पणी में हमारी चर्चा के आधार पर, यहाँ एक विचार है टाइप अप करें, आप इसका उपयोग कर रहे हैं: मॉड्यूलबिल्डर। डीफिन टाइप। DefineType पर एक अधिभार है जो विस्तार करने के लिए एक प्रकार लेता है। Link.। इसलिए, एक इंटरफ़ेस बनाएं (इसमें ईवेंट में कोई विधियां नहीं हैं), और जब आप गतिशील रूप से प्रकार का निर्माण कर रहे हों, तो उस इंटरफ़ेस को उस ओवरलोड का उपयोग करके बढ़ाएं जिसे मैंने आपको लिंक किया था। फिर उस इंटरफ़ेस पर एक एक्सटेंशन विधि बनाएं जो सेव() करता है।

http://msdn.microsoft.com/en-us/library/f53tx4x8.aspx

EDIT2::

एक और अधिभार कि ब्याज कि विस्तार करने के लिए एक प्रकार लेता है हो सकता है, और इंटरफेस नहीं है कोड का नमूना:

सबसे पहले, एक इंटरफेस बनाने के लिए:

public interface ISaveExtentable //I suck at naming stuff :-p 
{ 

} 

फिर, उस साइट में जिस कोड को आप पसंद करते हैं, उसमें आपको एक विधि मिल जाएगी: GetTypeBuilder। इस के लिए इसे बदल: कि इंटरफेस पर फिर

 private static TypeBuilder GetTypeBuilder(string typeSigniture) 
     { 
      AssemblyName an = new AssemblyName("TempAssembly" + typeSigniture); 
      AssemblyBuilder assemblyBuilder = 
       AppDomain.CurrentDomain.DefineDynamicAssembly(
        an, AssemblyBuilderAccess.Run); 
      ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule"); 

      TypeBuilder tb = moduleBuilder.DefineType("TempType" + typeSigniture 
           , TypeAttributes.Public | 
           TypeAttributes.Class | 
           TypeAttributes.AutoClass | 
           TypeAttributes.AnsiClass | 
           TypeAttributes.BeforeFieldInit | 
           TypeAttributes.AutoLayout 
           , typeof(object), new Type[] {typeof(ISaveExtentable)}); 
      return tb; 
     } 

, एक विस्तार विधि बना सकता हूँ करने के लिए बचाने के लिए:

public static class SaveExtendableExtensions 
    { 
      public static void Save(this ISaveExtentable ise) 
      { 
       //implement save functionality. 
      } 
    } 

आप सबसे अधिक संभावना आपके सहेजें विधि में प्रतिबिंब का उपयोग करने के लिए की आवश्यकता होगी सभी गुणों के बाद से गुण गतिशील रूप से बनाया गया था।

+0

"यदि XML संरचना एक ही हर बार होगा सपा निष्पादित करता है" मैं बीआरडी 1245 RFW 3456 परियोजना का नाम! आदि अलग विशेषताओं के साथ हर बार :( –

+0

हाँ, पर मैं वहाँ विशेषताओं से चुनने के लिए उपलब्ध हैं की एक सूची है यकीन है। Nullable फ़ील्ड के रूप में कक्षा में उन सभी विशेषताओं रखो (वे मूल्य प्रकार के होते हैं तो) और केवल उन लोगों को पॉप्युलेट करें जिन्हें आप वापस प्राप्त करते हैं। मुझे नहीं लगता कि आपको गतिशील रूप से एक प्रकार का निर्माण करने के लिए कुछ पागल समाधान का उपयोग करने की आवश्यकता है ... – BFree

+0

एक्सएमएल गतिशील रूप से उत्पन्न होता है और मैं ठोस कक्षाओं की पुस्तकालय को बनाए रखना नहीं चाहता प्रत्येक क्रमपरिवर्तन के लिए। –

1

मुझे लगता है कि इसे मिश्रण-इन्स कहा जाता है जो .NET में सीधे या आसानी से उपलब्ध नहीं होते हैं। हालांकि, जैसा कि मैं समझता हूं यह LinFu ढांचे के मुख्य कारणों में से एक है।

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