2009-06-10 12 views
24

परिदृश्य: मेरे पास बेस क्लास "माइबेस" है। मैं एक कस्टम विशेषता "MyAttrib"कस्टम विशेषता का बल उपयोग

मैं यह कर इसी के साथ

है:

[MyAttrib(1234)] 
class MyClass : MyBase() 
{ 
MyClass() 
{ 
} 
} 

प्रश्न: मैं MyBase से inherting किसी भी तरह से बल कक्षाओं में विशेषता MyAttrib के लिए कर सकते हैं?

उत्तर

25

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

+0

@ frederik-gheysels – devinbost

1

आप इसके लिए पोस्टशर्प का उपयोग कर सकते हैं। OnMethodInvocationAspect क्लास (PostSharp) से अपनी विशेषता वर्ग को विरासत में रखें, और CompileTimeValidate विधि को ओवरराइड करें।

थोड़ा समान; दूसरी तरह के आसपास यद्यपि (मैं केवल चाहता था कि एक निश्चित विशेषता वर्गों है कि एक विशेष इंटरफ़ेस कार्यान्वित करने के लिए लागू किया जा सकता): http://fgheysels.blogspot.com/2008/08/locking-system-with-aspect-oriented.html

2

क्या मैंने किया था एक अमूर्त संपत्ति या MyBase कक्षा में विधि था, ताकि कक्षाएं इनहेरिट इस संपत्ति/विधि को ओवरराइड (और इस प्रकार कार्यान्वित) करने के लिए मजबूर किया जाता है।

एक विशेषता के रूप में साफ नहीं है, लेकिन मेरी राय में रनटाइम पर जांच करने से बेहतर है।

+0

द्वारा नीचे दिए गए उत्तर को देखें मुझे लगता है कि यह परिदृश्य फिट बैठता है, तो यह भी क्लीनर होगा। –

0

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

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