c# - Calling a generic interface -


  सार्वजनिक इंटरफ़ेस IProcessor & lt; T & gt; {शून्य प्रक्रिया (टी उदाहरण); } Foreach (myClass.SomeCollection में AbstractType उदाहरण) OnProcess (उदाहरण); सार्वजनिक शून्य परप्रक्रिया & lt; T & gt; (टी आवृत्ति) {आई प्रोसेसर & lt; T & gt; प्रोसेसर = यूनिटी कंटैनेयर। रिज़ोलिव & lt; आईपीओसेसर & lt; T & gt; & gt; (); processor.Process (उदाहरण); }  

इस कोड के साथ समस्या यह है कि में OnProcess हमेशा AbstractType है, और नहीं उदाहरण के ठोस प्रकार को पारित किया जा रहा है मैं वर्तमान में दो संभावनाओं को देखता हूं।

01: एक गैर जेनेरिक आईपीओसेसर बनाएँ और इसे आईपीक्रॉसर के लिए आधार के रूप में प्रयोग करें। किसी भी लागूकर्ता को जेनेरिक और गैर-सामान्य दोनों प्रक्रिया विधियां, आमतौर पर टाइपकास्टिंग और सामान्य पद्धति से गुजरना होगा।

02: उपयोग करें Type.MakeGenericType आईपीओसीसेज़र प्राप्त करने के लिए, उसे हल करें, और फिर प्रक्रिया विधि को लागू करने के लिए प्रतिबिंब का उपयोग करें।

इन दोनों तरीकों को थोड़ा "अशुद्ध" लगता है। क्या कोई इस तरह से सोच सकता है कि मैं इन प्रथाओं का सहारा लेने के बिना ऐसा कर सकता हूं?

धन्यवाद

पीट

2 एक प्रदर्शन होगा हत्यारा (विशेष रूप से आवश्यक गतिशील / प्रतिबिंब invoke धीमी है)

1 इस समस्या का आम जवाब है, विशेष रूप से स्पष्ट कार्यान्वयन के साथ; समस्या को प्रकार का हो रहा है ... क्या एकता एक प्रकार उदाहरण के साथ क्वेरी को क्वेरी करता है, बल्कि जेनेरिक के बजाय? यदि ऐसा कुछ नीचे की तरह है ... ज़ाहिर है, तो आपको MakeGenericType :

  प्रकार intType = typeof (IProcessor & lt; & gt;) का उपयोग करना पड़ सकता है। MakeGenericType (instanceType ); आईपीसंसेसर proc = (आईओप्रोसेसर) IoC.Resolve (इंटटीप);  

जहां उदाहरण प्रकार शायद उदाहरण के माध्यम से है। GetType () । इसी कारणों के लिए, T को प्रकार के रूप में IProcessor पर प्रदर्शित करने में सहायक हो सकता है:

  सार्वजनिक इंटरफेस आईपीओसेसर {शून्य प्रक्रिया (वस्तु आवृत्ति); प्रकार टाइप करें InstanceType {get;}} सार्वजनिक इंटरफ़ेस आईपीओसेसर & lt; T & gt; : आईपीओसेसर {शून्य प्रक्रिया (टी आवृत्ति); } कक्षा कुछ क्लास: आईपीओसीएक्सएर & lt; int & gt; {सार्वजनिक शून्य प्रक्रिया (इंट आवृत्ति) (नया नोटिफाइड अपवाद फेंक); } टाइप करें IProcessor.InstanceType {get {return typeof (int);}} void iprocessor.process (वस्तु उदाहरण) {प्रक्रिया ((int) उदाहरण); बेशक, एक (वैकल्पिक) बेस-क्लास आपको इसके कुछ कार्यान्वयन से बचने की अनुमति दे सकता है:  
  अमूर्त वर्ग SomeBase & lt; T & gt; ; : आईओप्रोसेसर & lt; T & gt; {सार्वजनिक शून्य प्रक्रिया (टी उदाहरण) {ऑनप्रक्रैस (उदाहरण); } टाइप करें आईपीक्रेसर.इन्स्टेंसटाइप {रिटर्न टाइपफ (टी);}} शून्य आईपीक्रॉसर। प्रोसेस (ऑब्जेक्ट इन्सेंटेशन) {प्रोसेस ((टी) इंस्टेंस); } संरक्षित सार शून्य परप्रक्रिया (टी उदाहरण); }  

Comments