2008-12-18 9 views
5

मैंने सामान्य एक्सटेंशन विधियों को रखने के लिए एक अलग असेंबली बनाई है, एक्सटेंशन विधियां System.Web.dll (और अन्य) से कक्षाओं का उपयोग करती हैं।एक अलग असेंबली में बाधित जेनेरिक एक्सटेंशन विधियों का उपयोग एक संदर्भ त्रुटि

जब मैं तो एक नई परियोजना (कंसोल आवेदन) का संदर्भ देता है Utilities.dll विधानसभा कि विस्तार के तरीकों में शामिल है बनाने के लिए, मैं नई परियोजना के लिए System.Web.dll के लिए एक संदर्भ जोड़ने के लिए अगर यह विस्तार तरीकों कि फैली उपयोग नहीं करता है की जरूरत नहीं है System.Web.dll असेंबली में कोई भी वर्ग (उदाहरण के लिए System.Web.UI.Control)।

जब एक्सटेंशन विधियों में से एक एक सामान्य विधि होगी, तो सबकुछ अपेक्षित काम करेगा। लेकिन जैसे ही मैं जेनेरिक विधि में बाधा डालता हूं जो इसे System.Web.dll असेंबली में कक्षा में जोड़ता है, संकलक शिकायत करेगा कि मेरी नई परियोजना (कंसोल एप्लिकेशन) को System.Web.dll के संदर्भ की आवश्यकता है, भले ही नई परियोजना अभी भी कुछ भी उपयोग नहीं कर रही है वह सभा

दूसरे शब्दों में जब तक मेरे सामान्य तरीकों पर बाधा न हो, तब तक सब कुछ संकलित हो जाता है लेकिन जैसे ही मैं संक्रामक शिकायत करता हूं।

static void Main(string[] args) 
    { 
     bool isEmpty = "Hello World!".IsNullOrEmpty(); 

     Console.ReadLine(); 
    } 


अपडेट:: मार्क के रूप में (नीचे) ने बताया एक अलग नाम स्थान में उल्लंघन करने विधि डाल ठीक करता है

अपने एक्सटेंशन तरीकों का एक उदाहरण (एक पुस्तकालय Utilities.dll):

public static class StringExtensions 
{ 
    public static bool IsNullOrEmpty(this string value) 
    { 
     return string.IsNullOrEmpty(value); 
    } 
} 

public static class ControlExtensions 
{ 
    // If I remove the where clause it compiles 
    public static T FildChild<T>(this Control parent, string id) 
     where T : Control 
    { 
     throw new NotImplementedException(); 
    } 
} 

And here is a new console application that won't compile (unless I also add a reference to System.Web.dll के रूप में संकलित) इकट्ठा मुसीबत।

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

उत्तर

5

अच्छा, हाँ! संकलित करने के लिए, इसे सार्वजनिक/संरक्षित एपीआई में सब कुछ हल करने में सक्षम होना चाहिए। अन्यथा यह बाधा को लागू नहीं कर सकता है। मुझे कल्पना है कि यह देखने के लिए प्रकारों को पहचानने की आवश्यकता है कि एक्सटेंशन विधि किसी विधि के लिए उम्मीदवार है या नहीं।

आप विस्तार विधियों को उस बच्चे नामस्थान में रखने का प्रयास कर सकते हैं जिसमें "वेब" है - कम से कम तब यह नियमित कोड में नहीं चलेगा। मैंने चेक किया है, और यह समस्या को हल करता है। जब कॉलर को दायरे में होना चाहिए तो नियंत्रण विधियों के नामस्थानों को अलग करना अच्छा अभ्यास है।

निष्पादित करने के लिए, इसे आंतरिक रूप से उपयोग किए जाने वाले कुछ भी हल करने में सक्षम होने की आवश्यकता होगी लेकिन एपीआई में उजागर नहीं किया गया है। यह मानक व्यवहार है।

+0

मुझे यकीन नहीं है कि मैं पूरी तरह से समझता हूं। 1) मेरी परियोजना उस प्रकार का उपयोग नहीं कर रही है। 2) विस्तार विधि पहले से ही विधि के पहले तर्क में टाइप का उपयोग करती है तो बाधा इस पागलपन को क्यों ट्रिगर करती है? – Yona

+0

मुझे नहीं लगता कि यह सवाल का जवाब देता है। जब कोड को पैरामीटर प्रकार के रूप में संदर्भित किया जाता है तब भी उसका कोड ठीक संकलित होता है, लेकिन यदि वह इसे एक ही विधि * के रूप में एक बाधा के रूप में नहीं जोड़ता है। वह नियंत्रण एक्सटेंशन वर्ग का भी संदर्भ नहीं दे रहा है। –

+0

आश्चर्यजनक रूप से अपमानजनक विधि को एक अलग नामस्थान में रखकर (किसी भी नाम के साथ जब तक यह अन्य एक्सटेंशन के साथ नहीं है) समस्या को हल करता है। सबसे अच्छा अजीब। – Yona

1

@Marc आपको क्यों देता है। मैं सुझाव दूंगा कि एक अच्छी प्रैक्टिस के रूप में आप वेब क्लास को किसी और असेंबली में संदर्भित करते हैं, कॉम। कॉम्पनी.एक्सटेंशन। Com. company.Extensions के अलावा। फिर आप वेब परियोजनाओं और अन्य परियोजनाओं में केवल गैर-वेब एक्सटेंशन दोनों शामिल कर सकते हैं।

+0

ठीक है कि मैंने यह कैसे किया। मेरे पास है .WebUtilities.dll असेंबली – Yona

+0

बीटीडब्ल्यू मुझे यकीन नहीं है कि मैं मार्क के जवाब को समझता हूं कृपया मेरी टिप्पणी देखें। – Yona

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