2010-01-07 16 views
5

में विशेषता छुपाएं मेरे पास एक विशेषता के साथ एक बेस क्लास है और मैं इसे व्युत्पन्न कक्षा में छिपाना चाहता हूं। प्रतिबिंब का उपयोग करने के अलावा ऐसा करने का कोई तरीका है?सी # छुपा वर्ग

[Authorize(Roles = "User,Admin,Customs")] 
public abstract class ApplicationController : Controller 
{ 
} 

// hide the Authorize attribute 
public class ErrorController : ApplicationController 
{ 
} 
+0

किसी कारण से मैं इस प्रश्न के बारे में उलझन में हूं। –

+0

यदि यह एमवीसी के बारे में है, तो कृपया इसे इस तरह टैग करें। –

+0

प्रतिबिंब के साथ देखने में सक्षम नहीं होने की तरह कि बेस क्लास उस विशेषता के साथ सजाया गया है? –

उत्तर

2

आप प्राधिकरण एट्रिब्यूट को अपनी कक्षा के साथ ओवरराइड कर सकते हैं और इसे विरासत में नहीं मिला है।

[AttributeUsage(AttributeTargets.Class, Inherited=false)] 
public class NonInheritedAuthorizeAttribute : AuthorizeAttribute 
{ 
    // Constructors, etc. 
} 

अब आप किस वर्ग का उपयोग करने के, जब तक कि आप खुद ApplicationController निर्दिष्ट कर सकते हैं।

+0

मैंने यह भी करने के बारे में सोचा, लेकिन जब भी संभव हो, मैं माइक्रोसॉफ्ट कक्षाओं का उपयोग करने की कोशिश करता हूं इसलिए मैंने अपनी बेस क्लास से प्राधिकृत विशेषता को हटाने का विकल्प चुना और इसे प्रत्येक व्युत्पन्न नियंत्रक में जोड़ा। 'इनहेरिट = झूठी' के लिए – PaulN

+0

+1, एमवीसी के बारे में नहीं, लेकिन सुनिश्चित करें कि व्युत्पन्न वर्ग/विधि विशेषता गुणों को संशोधित करने का प्रयास नहीं कर रही है। – CallMeLaNN

1

'छुपाएं' से आपका क्या मतलब है उस पर थोड़ा सा निर्भर करता है। आप इस तरह प्राधिकरण रद्द करने के लिए सक्षम होना चाहिए:

// hide the Authorize attribute 
[Authorize(Roles = "")] 
public class ErrorController : ApplicationController 
{ 
} 
+1

यह वही है जो मैं करना चाहता हूं (एक गैर अधिकृत व्यक्ति को देखने को देखने की अनुमति दें)। दुर्भाग्यवश, AuthorizeAttribute पहले जांचता है कि (! User.Identity.Is प्रमाणीकृत) तो यह भूमिकाओं को मान्य करता है। इसलिए मैं केवल त्रुटि नियंत्रणकर्ता वर्ग के लिए बेस क्लास से विशेषता को छिपाना या हटाना चाहता हूं। – PaulN

+2

शायद आपको विरासत डिज़ाइन पर पुनर्विचार करना चाहिए: एक नई बेस क्लास की खोज करें और उस से दोनों नियंत्रकों को प्राप्त करें। –

2

यदि यह एक विधि/प्रोप था, आप हमलावर विशेषता बिना फिर से घोषित कर सकता है (new) के सदस्य। मुझे कक्षा-स्तर के गुणों के साथ एक तरीके से पता नहीं है।

public new SomeType Foo() { return base.Foo(); } 
0

आप AttributeUage 'विशेषता अपने गुण वर्ग पर, इस तरह निर्दिष्ट कर सकते हैं: फिर कक्षाओं उस वर्ग जहां विशेषता द्वारा लागू किए गए से निकाले जाते हैं

[AttributeUsage(AttributeTargets.Class, Inherited=false)] 
public class AuthorizeAttribute : Attribute 
{ 
} 

,, लागू नहीं होंगे विशेषता।

ओउ, अब मुझे एहसास है कि प्राधिकरण विशेषता एक कस्टम विशेषता नहीं है।

+0

हां, यह System.Web.MVC में Microsoft टीम द्वारा बनाई गई एक क्लास है। – PaulN

3

बेस क्लास से विरासत में प्राप्त सुविधाओं को हटाने से Liskov Substitution Principle का उल्लंघन होता है। ब्रेकिंग विरासत इस तरह से रूट समस्या को बदलने में बहुत देर हो जाने के बाद आमतौर पर अनजान और अप्रत्याशित परिणामों के साथ अपने बदसूरत सिर को पीछे छोड़ देता है —।

तो यदि कोई रास्ता है, तो भी मैं जवाब दूंगा कि आपको इसका अधिकांश समय उपयोग नहीं करना चाहिए। विरासत के विकल्प लागू हो सकते हैं, जैसे कि रोकथाम (विरासत के के बजाय है-) या आधार को एक अलग इंटरफ़ेस में दोबारा दोहराया जा सकता है जो दोनों लागू कर सकते हैं; या इन दोनों को भी गठबंधन करें।

+0

ठीक है, बेस क्लास का उपयोग कर साइट के लिए डिफ़ॉल्ट प्रमाणीकरण सेट करना अच्छा लगेगा। मेरे पास केवल 9 में से 1 नियंत्रक है जो केवल व्यवस्थापक को अनुमति देता है। चूंकि बेस क्लास विशेषता को निकालना संभव नहीं लगता है, इसलिए यह सबसे अच्छी सलाह है।मैंने हटा दिया है [प्राधिकरण (भूमिकाएं = "उपयोगकर्ता, व्यवस्थापक, सीमा शुल्क")] और मैं इसे हर नियंत्रक में बस सेट कर दूंगा। – PaulN

+0

गुण वर्ग के सदस्यों की तरह नहीं हैं, और आवश्यक रूप से विरासत में नहीं हैं (यही कारण है कि 'विशेषता यूज (विरासत = झूठी) ') है। तो एलएसपी जरूरी नहीं है कि यहां आवेदन करें। –

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