2010-05-28 12 views
5

मैं किसी ऑब्जेक्ट के लिए जेनेरिक रैपर बनाने का कोई तरीका ढूंढ रहा हूं।
रैपर ऑब्जेक्ट उस वर्ग की तरह व्यवहार करेगा जो इसे लपेटता है, लेकिन अधिक गुण, चर, विधियों इत्यादि के लिए सक्षम होगा, उदाहरण के लिए वस्तु गिनती, कैशिंग आदिऑब्जेक्ट्स के लिए सी # रैपर

आवरण वर्ग आवरण कहा जा कहो, और कक्षा स्क्वायर कहा जा लिपटे और निर्माता स्क्वायर (डबल edge_len) है हो सकता है और गुण/तरीकों EdgeLength और क्षेत्र, मैं इस प्रकार के रूप में उपयोग करना चाहते हैं:

Wrapper<Square> mySquare = new Wrapper<Square>(2.5); /* or */ new Square(2.5); 
Console.Write("Edge {0} -> Area {1}", mySquare.EdgeLength, mySquare.Area); 

जाहिर है मैं इस तरह के एक आवरण वर्ग प्रत्येक वर्ग मैं रैप करने के लिए चाहते हैं के लिए, मैं बना सकते हैं, लेकिन मैं एक सामान्य समाधान के लिए देख रहा हूँ। ई। Wrapper<T> जो आदिम और यौगिक दोनों प्रकारों को संभाल सकता है (हालांकि मेरी वर्तमान स्थिति में मैं केवल अपनी कक्षाओं को लपेटने से खुश हूं)।

सुझाव?

धन्यवाद।

+0

आप इसे सी # तक 3.0 तक नहीं कर सकते हैं। संस्करण 4.0, हालांकि, आपको नई गतिशील प्रकार प्रणाली के माध्यम से ऐसा करने दे सकता है। –

+0

क्या आप विस्तृत कर सकते हैं? धन्यवाद। – Haggai

उत्तर

2

कैसल परियोजना से DynamicProxy आप के लिए समाधान हो सकता है।

+1

+1, हाँ - प्रश्न स्पष्ट रूप से प्रॉक्सी कार्यान्वयन की तलाश में है। डायनामिकप्रॉक्सी का व्यापक रूप से .NET ओपन सोर्स वर्ल्ड (एनएमॉक 2, एनएचबर्ननेट, निनजेक्ट इत्यादि) में उपयोग किया जाता है। एकमात्र महत्वपूर्ण चेतावनी यह है कि आप सीलबंद कक्षाओं के लिए प्रॉक्सी का उपयोग नहीं कर पाएंगे। –

+0

धन्यवाद! यह वास्तव में उस समाधान की तरह दिखता है जिसे मैं ढूंढ रहा था (हालांकि मुझे इसमें अधिक खोदना होगा)। – Haggai

4

Decorator pattern का उपयोग करें या extension methods लिखें।

+1

धन्यवाद। सजावट पैटर्न उपयुक्त नहीं हैं, मुझे लगता है, क्योंकि उन्हें मुझे अपने पूरे कार्यक्रम को बदलने के लिए बदलने की आवश्यकता है, और मैं चाहता हूं कि रैपर विस्तार के तरीकों के बारे में टी के उपयोगकर्ता के लिए पारदर्शी हो। - क्या आप एक जोड़ने के लिए एक समान विधि का उपयोग कर सकते हैं वर्ग के लिए परिवर्तनीय (यानी प्रत्येक वस्तु के लिए)? या केवल तरीकों? – Haggai

2

हो सकता है कि कुछ इस तरह:

public class Wrapper<T> 
{ 
    public readonly T Object; 

    public Wrapper(T t) 
    { 
     Object = t; 
    } 
} 

और फिर आप इसे इस्तेमाल कर सकते हैं इस प्रकार है:

Wrapper<Square> mySquare = new Wrapper<Square>(new Square(2.5)); 
Console.Write("Edge {0} -> Area {1}", mySquare.Object.EdgeLength, mySquare.Object.Area); 
+0

धन्यवाद, लेकिन यही वह है जिसे मैं टालने की कोशिश कर रहा हूं। मैं चाहता हूं कि रैपर टी – Haggai

+0

के उपयोगकर्ता के लिए पारदर्शी हो। यह उत्तर मुझे बहुत मदद करता है: डी – Krishan