2010-03-26 25 views
5

मैं एक विस्तार विधि System.Security.Principal.IIdentity पर HasContentPermission बुलाया बनाया:मेरी विस्तार विधि मेरी परीक्षा कक्षा में क्यों दिखाई नहीं दे रही है?

namespace System.Security.Principal 
{ 
    public static class IdentityExtensions 
    { 
     public static bool HasContentPermission 
      (this IIdentity identity, int contentID) 
     { 
      // I do stuff here 
      return result; 
     } 
    } 
} 

और मैं इसे इस तरह कहते हैं:

bool hasPermission = User.Identity.HasPermission(contentID); 

वर्क्स एक आकर्षण की तरह। अब मैं इकाई का परीक्षण करना चाहता हूं।

using System.Security.Principal; 

namespace MyUnitTests 
{ 
    [TestMethod] 
    public void HasContentPermission_PermissionRecordExists_ReturnsTrue() 
    { 
     IIdentity identity; 
     bool result = identity.HasContentPermission(... 

लेकिन HasContentPermission IntelliSense नहीं करेंगे: कि ऐसा करने के लिए, सभी मैं वास्तव में क्या करने की जरूरत विस्तार विधि सीधे कॉल, तो है। मैंने एक स्टब क्लास बनाने की कोशिश की जो IIdentity से विरासत में है, लेकिन यह भी काम नहीं करता है। क्यूं कर?

या क्या मैं इस गलत तरीके से जा रहा हूं?

+0

पहले कोड ब्लॉक में आपका वाक्यविन्यास गलत है - आप नामस्थान स्कोप में कोई विधि परिभाषित नहीं कर सकते ... क्या आप अपना वास्तविक कोड डाल सकते हैं? –

+1

क्या आप सुनिश्चित हैं कि आपकी टेस्ट प्रोजेक्ट असेंबली का संदर्भ दे रही है कि आपका विस्तार विधि (केवल नामस्थान की बजाय) में रहता है? –

+0

@Reed: मैंने लापता कोड जोड़ने के लिए प्रश्न संपादित किया। –

उत्तर

14

सुनिश्चित करें कि आपने:

  1. वर्ग स्थिर बना
  2. वर्ग बुला कोड
  3. प्रकार से पहले this शामिल करने के लिए सुलभ
  4. विस्तार युक्त परियोजना का निर्माण का विस्तार करने के लिए बनाया
  5. आपकी यूनिट परीक्षण परियोजना
  6. में प्रोजेक्ट का संदर्भ जोड़ा गयाजोड़ा गया 210 किसी भी स्रोत फ़ाइल में एक्सटेंशन विधि का उपयोग करता है जो आपकी एक्सटेंशन विधि को किसी भिन्न पैकेज के अंदर निहित किया गया है

ध्यान दें कि आपको अपने उदाहरण में एक टाइपो भी मिला है (मुझे लगता है) विधि में नहीं है एक कक्षा।

अंत में, मैं आधिकारिक .NET नामस्थानों में विधियों को डालने से बचूंगा। यह केवल आपके बाद आने वाले किसी के लिए भ्रमित हो सकता है जो सोच सकता है कि विधि आधिकारिक रूप से समर्थित विधि है जब वास्तव में यह आपकी खुद की है और आपकी परियोजना के भीतर निहित है।

+0

धन्यवाद। मैं परीक्षण परियोजना में मुख्य परियोजना का संदर्भ जोड़ना भूल गया। मैं हमेशा ऐसा करना भूल जाता हूं। किसी कारण से मैं हमेशा यह मानता हूं, क्योंकि दोनों परियोजनाएं एक ही समाधान में हैं, कि वे एक-दूसरे से अवगत हैं। –

+1

जबकि आप तथ्यों पर सही हैं, मुझे फ्रेमवर्क कक्षाओं को विस्तारित करने के बारे में आपकी राय से असहमत होना है। यह उनका * प्राथमिक * उद्देश्य है। –

+2

@ स्टेवन - फ्रेमवर्क कक्षाओं का विस्तार करना ठीक है। क्या बुरा है उन एक्सटेंशन को फ्रेमवर्क नेमस्पेस में डाल रहा है। – Greg

2

विस्तार विधि एक स्थिर वर्ग में होनी चाहिए। आपकी स्थिर कक्षा कहां है? क्या आपका कोड संकलित है?

+0

क्षमा करें। मैंने लापता कोड जोड़ने के लिए सवाल संपादित किया। प्रोजेक्ट को संदर्भित करने के लिए –

3

मुझे संदेह है कि इस तथ्य के साथ कुछ करना है कि आपने मौजूदा System.Security.Principal नामस्थान में एक एक्सटेंशन विधि जोड़ा है। सुनिश्चित करें कि आप उस प्रोजेक्ट का संदर्भ लें जो एक्सटेंशन विधि को परिभाषित करता है, या इसे किसी भिन्न नामस्थान से आज़माएं।

+0

+1 ... वह समस्या थी। नाम स्थान मुद्दे के लिए –

+0

+1। वह मेरी समस्या थी। – Sumant

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

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