c# - Base Class Enum Implemented Differently in Derived Classes -


मेरे परिदृश्य:

  सार्वजनिक वर्ग EntityBase {सार्वजनिक इन्ट आईडी {get; सेट; } [आवश्यक ()] सार्वजनिक स्ट्रिंग नाम {get; सेट; } // और यह है कि मुझे क्या हो रहा है // मुझे एक "प्रकार" enum}  

चाहते हैं तो व्युत्पन्न कक्षाओं में अलग-अलग एंजाइम होंगे जो कि वे टाइप करने के लिए निर्दिष्ट करेंगे।

  सार्वजनिक वर्ग AnimalEntity: EntityBase {// प्रकार में एक 'पशु प्रकार' का मूल्य होगा: भूमि, सागर या वायु // कार्यान्वयन कोड ऐसा कुछ करेगा: // myAnimal.Type = AnimalType भूमि} सार्वजनिक वर्ग की व्यक्तित्व: EntityBase {// प्रकार 'व्यक्ति प्रकार' का मान होता है: डॉक्टर, वकील या अभियंता // कार्यान्वयन कोड ऐसा कुछ करेगा: // myPerson.Type = PersonType.Lawyer} सार्वजनिक वर्ग MonsterEntity: EntityBase { // प्रकार 'राक्षस प्रकार' मान होगा: Goblinoid, Undead}  

तो, बड़ा सवाल यह है कि मैं क्या करने की कोशिश कर रहा हूँ, है ना? मैं एक बेस रिपॉज़िटरी क्लास बनाने की कोशिश कर रहा हूं, जो प्रकार के आधार पर समूह को वापस करेगा। मेरी सारी संस्थाओं में "प्रकार" का कोई प्रकार होगा, और मैं एक सामान्य "समूह प्रकार" को बनाना चाहता हूं।

  सार्वजनिक सार वर्ग रिपोजिटरीबेस & lt; T & gt; : आईआरएपोज़ोरिरीबेस & lt; T & gt; जहां टी: EntityBase {// हमारा आम GetAsync, GetByIdAsync, और हमारे सभी अन्य CRUD // और फिर कुछ ऐसा: सार्वजनिक IEnumerable & lt; GroupedData & lt; स्ट्रिंग, T & gt; & gt; GetGroupedByType (स्ट्रिंग खोजटर्म) {var संस्थाओं = डीबीएससेट में जहां से (सर्चटर्म == रिक्त || s.Name.ToLower ()। इसमें शामिल है (सर्चटर्म)) ग्रुप एस द्वारा s.Type में नए समूहबद्धडेटा & lt; स्ट्रिंग, T & gt; {कुंजी = जी। के। टॉस्ट्रिंग (), डेटा = जी}; वापसी (संस्थाएं); }}  

जब टी प्रजातियां होती है, तो मैं संबंधित संस्थाओं के साथ भूमि, सागर और वायु समूह को प्राप्त कर सकता हूं। व्यक्तिपरकता के लिए, मुझे डॉक्टर, वकील, इंजीनियर समूह मिलेगा I

यदि मेरा दृष्टिकोण / डिजाइन अमान्य या आदर्श से कम है, तो कृपया मुझे बताएं।

Enum (कृपया मुझे माफ़ कर दो) ऐसे द्वितीय श्रेणी नागरिक हैं, इसलिए आप जिस चीज के बारे में सोच सकते हैं काम न करें :

  क्लास EntityBase & lt; T & gt; जहां टी: enum {सार्वजनिक टी प्रकार {get; सेट; दुर्भाग्य से यह संकलन नहीं करता है, फिर आप एक बेस क्लास के साथ  enum  को बदलने का विचार कर सकते हैं: 

  class EntityBase & LT; टी & gt; जहां टी: EntityTypeBase {सार्वजनिक टी प्रकार {get; सेट; }  

आपको == और ! = के साथ आराम करने की आवश्यकता होती है; EntityTypeBase में कार्यान्वित करना > ऑपरेटर्स, IConvertible इंटरफ़ेस और अन्य बॉयलरप्लेट)। यह बहुत सी कोड है और आपको ईएफ में भी इसे प्रबंधित करने की ज़रूरत होगी (अन्यथा आप अपनी क्वेरी में ऐसी संपत्ति का उपयोग नहीं कर पाएंगे जब तक कि आप स्मृति में सब कुछ वस्तुओं के रूप में लोड न करें)। आप (रन-टाइम चेक के साथ) भी हो सकते हैं, लेकिन यह ईएफ में एसक्यूएल कोड पीढ़ी को तोड़ देगा।

मैं इस बात का सुझाव देता हूं इस मामले में एक प्रकार ईएफ का उपयोग करना है और समझने। आप एक स्ट्रिंग (यदि आप चाहें) या एक पूर्णांक (इस उदाहरण के रूप में) का उपयोग कर सकते हैं:

  वर्ग EntityBase सार्वजनिक वर्चुअल इंट प्रकार {get; सेट; }}  

एक व्युत्पन्न वर्ग में:

<पूर्व> श्रेणी AnimalEntity: EntityBase {सार्वजनिक ओवरराइड इंट टाइप {get {return base.Type; } सेट {if (! Enum.IsDefined (typeof (AnimalType), मान)) नए तर्क को छोड़ें एक्सक्शंस (); Base.Type = (int) मान; }}}

इस तरह से आप अब भी PersonType.Layer और AnimalType.Land का इस्तेमाल कर सकते हैं। बेशक आपको डुप्लिकेट किए गए मानों (अन्यथा समूह काम नहीं करेगा] के लिए अपने ईनियम इन-सिंक रखने की आवश्यकता है।

पिछले के रूप में भी कृपया उपयोग करने पर विचार ... एक और इकाई यदि आपके पास एक अन्य तालिका है EntityType :

 आईडी का नाम लागू करने के लिए 0 शेवर व्यक्ति 1 प्रोग्रामर व्यक्ति 2 भूमि पशु ... 

आपको क्या करना है सेटर यह जांचने के लिए है कि क्या प्रकार लागू है या नहीं और आपके पास कुछ सुविधा वर्ग हैं, जो उन्हें प्रकार के अनुसार समूह देंगे:

  सार्वजनिक स्थिर वर्ग PersonType {सार्वजनिक स्थिर EntityType वकील {get} } सार्वजनिक स्थिर EntityType प्रोग्रामर {get {...}}}  

आईएमओ यह बेहतर पैमाने है (नए आइटम जोड़ने में आसान है और आप भविष्य में, प्रतिनिधि कर सकते हैं , EntityType आइटम के लिए कुछ व्यवहार) और हार्ड-कोडित स्थिरांकों की तुलना में यह सुरक्षित है (क्योंकि ईमानदारी केवल डीबी इंजन द्वारा दी जाती है)। EntityType तालिका में खोज के लिए भुगतान करने के लिए बेशक कीमत अतिरिक्त ओवरहेड है (जब तक कि आप कुछ कैशिंग तंत्र का उपयोग नहीं करते हैं)।


Comments