2012-01-31 16 views
39

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

जब मैं ग्राहकों द्वारा उन्हें फोन नहीं करना चाहता हूं तो मैं इंटेलिजेंस में सार्वजनिक तरीकों को दिखाने से कैसे रोकूं?वास्तविक प्रश्न, पलिश्तियों के लिए यह कैसा है! यह एमईएफ गुणों पर भी लागू हो सकता है जिन्हें सार्वजनिक होना पड़ता है हालांकि कभी-कभी आप उन्हें ग्राहकों से छिपाना चाहते हैं।

अद्यतन: मैंने इस प्रश्न को पोस्ट करने के बाद से डेवलपर के रूप में परिपक्व हो गया है। इंटरफ़ेस छिपाने के बारे में मुझे बहुत ज्यादा परवाह क्यों है मेरे बाहर है।

+2

उन्हें सार्वजनिक बना आप उन्हें एक्सेस किए जाने की/इस्तेमाल किया नहीं चाहते हैं तो न करें। – Oded

+0

तो किसी ऑब्जेक्ट के कन्स्ट्रक्टर में विधियों को कॉल जोड़ने के बजाय, आप गुण जोड़ रहे हैं और उन्हें प्रतिबिंब के माध्यम से बुला रहे हैं? जहां तक ​​"बेहतर समर्थन आंशिक कक्षाओं" के बारे में आपकी टिप्पणी है, यह नहीं है कि किस आंशिक तरीके के लिए हैं? – cadrell0

+2

स्पष्ट इंटरफ़ेस कार्यान्वयन पर विचार करने का एक वैकल्पिक दृष्टिकोण हो सकता है। तब विधियां कक्षा के सार्वजनिक एपीआई का हिस्सा नहीं हैं, लेकिन केवल इंटरफ़ेस के माध्यम से दिखाई देती हैं। –

उत्तर

-1

आंशिक तरीकों के बारे में मेरी टिप्पणी पर विस्तार करने के लिए। इस

Foo.part1.cs

partial class Foo 
{ 
    public Foo() 
    { 
     Initialize(); 
    } 

    partial void Initialize(); 
} 

Foo.part2.cs

partial class Foo 
{ 
    partial void Initialize() 
    { 
     InitializePart1(); 
     InitializePart2(); 
     InitializePart3(); 
    } 

    private void InitializePart1() 
    { 
     //logic goes here 
    } 

    private void InitializePart2() 
    { 
     //logic goes here 
    } 

    private void InitializePart3() 
    { 
     //logic goes here 
    } 
} 
+0

आखिरकार मैंने जो किया। * श्वास * – Jordan

+0

ठीक है, बिल्कुल नहीं। मैंने केवल आंशिक कक्षाओं में निजी विधियों का उपयोग किया जिन्हें मैंने प्राथमिक वर्ग से बुलाया था। मेरे पास कई आंशिक कक्षाएं हैं, मैं पागल हूं। मदद चाहिए। * श्वास * – Jordan

81

EditorBrowsable विशेषता का उपयोग करते हुए की तरह तो एक विधि IntelliSense में दिखाया जाना नहीं होगा:

[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] 
public void MyMethod() 
{ 
} 
+1

हाँ, मैंने कोशिश की। यह काम नहीं करता है। विधि अभी भी सदस्य सूची में दिखाती है। – Jordan

+12

@ जोर्डन मैंने अभी इसे स्वयं करने की कोशिश की है और जब मैं लाइब्रेरी के डीएलएल का संदर्भ दे रहा हूं तो यह विधि नहीं दिखाता है। हालांकि, यह दिखाता है कि क्या परियोजना एक ही समाधान में है और मैं परियोजना का संदर्भ दे रहा हूं। –

+7

हां, यह अपेक्षित व्यवहार है। जब आप कोड लिखते हैं तो यह * * * से आइटम फ़िल्टर करने का इरादा नहीं है! –

15

की तरह कुछ की कोशिश करो आप के लिए EditorBrowsableAttribute

निम्न नमूना दर्शाता है कि कैसे छिपाने के लिए देख रहे हैंके लिए उपयुक्त मान निर्धारित करके IntelliSense से की एक संपत्ति की संपत्तिEditorBrowsableAttribute विशेषता। अपनी खुद की असेंबली में कक्षा 1 बनाएँ।

विजुअल स्टूडियो में, एक नया विंडोज़ एप्लिकेशन समाधान बनाएं, और को उस विधानसभा के संदर्भ में जोड़ें जिसमें कक्षा 1 है। फॉर्मकन्स्ट्रक्टर में, कक्षा 1 का एक उदाहरण घोषित करें, इंस्टेंस का नाम टाइप करें, और कक्षा 1 सदस्यों की IntelliSense ड्रॉप-डाउन सूची को सक्रिय करने के लिए अवधि कुंजी दबाएं। आयु संपत्ति ड्रॉप-डाउन सूची में दिखाई नहीं देती है।

using System; 
using System.ComponentModel; 

namespace EditorBrowsableDemo 
{ 
    public class Class1 
    { 
     public Class1() 
     { 
      // 
      // TODO: Add constructor logic here 
      // 
     } 

     int ageval; 

     [EditorBrowsable(EditorBrowsableState.Never)] 
     public int Age 
     { 
      get { return ageval; } 
      set 
      { 
       if (!ageval.Equals(value)) 
       { 
        ageval = value; 
       } 
      } 
     } 
    } 
} 
+14

संपादकब्रोसेबल केवल विधि को छुपाता है यदि आप केवल डीएल आयात कर रहे हैं, न कि अगर आप समाधान में किसी अन्य प्रोजेक्ट का संदर्भ दे रहे हैं तो मुझे लगता है –

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