मैं यह जांचना चाहता हूं कि रनटाइम पर ज्ञात एक प्रकार पैरामीटर रहित कन्स्ट्रक्टर प्रदान करता है या नहीं। Type
कक्षा ने कुछ भी वादा नहीं किया, इसलिए मुझे लगता है कि मुझे प्रतिबिंब का उपयोग करना है?मैं कैसे जांचूं कि कोई प्रकार पैरामीटर रहित कन्स्ट्रक्टर प्रदान करता है या नहीं?
उत्तर
Type
वर्ग प्रतिबिंब है। आप कर सकते हैं:
Type theType = myobject.GetType(); // if you have an instance
// or
Type theType = typeof(MyObject); // if you know the type
var constructor = theType.GetConstructor(Type.EmptyTypes);
यदि पैरामीटर रहित कन्स्ट्रक्टर मौजूद नहीं है तो यह शून्य हो जाएगा।
तो आप निजी निर्माताओं को खोजने के लिए चाहते हैं, थोड़ा लंबा का उपयोग करें:
var constructor = theType.GetConstructor(
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
null, Type.EmptyTypes, null);
मूल्य प्रकार हैं, जिनमें aren't allowed to have a default constructor के लिए एक चेतावनी है। आप जांच सकते हैं कि आपके पास Type.IsValueType
प्रॉपर्टी का उपयोग करके कोई मान प्रकार है, और Activator.CreateInstance(Type)
का उपयोग करके उदाहरण बनाएं;
यह निजी ctors fyi –
नहीं मिलेगा यह मूल्य प्रकारों के लिए भी काम नहीं करेगा। – leppie
उपरोक्त टिप्पणियों को संबोधित किया गया। –
हां, आपको प्रतिबिंब का उपयोग करना होगा।
var t = x.GetType();
var c = t.GetConstructor(new Type[0]);
if (c != null) ...
यह काम करना चाहिए:: लेकिन आप पहले से ही है कि जब आप GetType()
कुछ की तरह इस्तेमाल करते हैं
myClass.GetType().GetConstructors()
.All(c=>c.GetParameters().Length == 0)
मेरा मतलब क्या नहीं था, लेकिन कृपया हटाएं - यह एक संबंधित मुद्दा और अच्छी जानकारी है। – mafu
हां, आपको प्रतिबिंब का उपयोग करना होगा।
object myObject = new MyType();
Type type = myObject.GetType();
ConstructorInfo conInfo = type.GetConstructor(new Type[0]);
अपनी स्थिति पर निर्भर करता है, तो आप भी एक सामान्य प्रकार प्रतिबंध इस्तेमाल कर सकते हैं:
public void DoSomethingWith<T>(T myObject) where T:new() {...}
उपरोक्त विधि घोषणा किसी भी वस्तु है कि एक parameterless निर्माता के साथ instantiated किया जा सकता है के लिए पैरामीटर प्रकार को प्रतिबंधित करेगा। यहां का लाभ यह है कि कंपाइलर उस वर्ग के साथ विधि का उपयोग करने के किसी भी प्रयास को पकड़ लेगा जिसमें पैरामीटर रहित कन्स्ट्रक्टर नहीं है, इसलिए जब तक संकलन समय पर टाइप को ज्ञात किया जाता है, यह काम करेगा और आपको चेतावनी देगा पहले समस्या
बेशक अगर प्रकार वास्तव में केवल रनटाइम पर जाना जाता है (यानी आप स्ट्रिंग या एक निर्मित प्रकार के आधार पर ऑब्जेक्ट को तुरंत चालू करने के लिए एक्टिवेटर.क्रेट इंस्टेंस() का उपयोग कर रहे हैं तो यह आपकी मदद नहीं करेगा। मैं आमतौर पर पूर्ण अंतिम विकल्प के रूप में प्रतिबिंब का उपयोग करता हूं, क्योंकि एक बार जब आप गतिशील भूमि पर जाते हैं तो आपको बहुत अधिक गतिशील भूमि में रहना पड़ता है; गतिशील रूप से कुछ तेज़ी से शुरू करने के लिए आमतौर पर मुश्किल या यहां तक कि गड़बड़ी होती है और फिर इसे स्थिर रूप से निपटना शुरू कर देती है।
वास्तव में, स्थैतिक और गतिशील आमंत्रण की भूमि को ब्रिज करने के लिए एक बहुत उपयोगी पैटर्न है: एक स्थैतिक जेनेरिक कैशिंग कक्षा [उदा। 'समानता कॉम्पैयर। डीफॉल्ट
type.GetConstructor(Type.EmptyTypes) != null
struct
एस के लिए विफल हो जाएगा। बेहतर यह विस्तार करने के लिए:
public static bool HasDefaultConstructor(this Type t)
{
return t.IsValueType || t.GetConstructor(Type.EmptyTypes) != null;
}
में सफलता के बाद से भी enum
डिफ़ॉल्ट parameterless निर्माता है। प्रतिबिंब कॉल नहीं होने के बाद भी मूल्य प्रकारों के लिए थोड़ा सा गति।
मुझे केवल वैकल्पिक पैरामीटर के साथ कन्स्ट्रक्टरों की गिनती करने की आवश्यकता है जो वास्तविक पैरामीटर-कम कन्स्ट्रक्टर के समान हैं।ऐसा करने के लिए:
myClass.GetType().GetConstructors()
.All(c => c.GetParameters().Length == 0 || c.GetParameters().All(p => p.IsOptional))
- 1. KeyValuePair - कोई पैरामीटर रहित कन्स्ट्रक्टर नहीं है?
- 2. एसक्यूएलमैटल कक्षाएं उत्पन्न करता है लेकिन पैरामीटर रहित कन्स्ट्रक्टर नहीं
- 3. मैं कैसे जांचूं कि $ _GET पैरामीटर मौजूद है या नहीं, लेकिन इसका कोई मूल्य नहीं है?
- 4. ऑटोफैक पैरामीटर रहित कन्स्ट्रक्टर चयन
- 5. मैं कैसे जांचूं कि कोई पॉइंटर न्यूल पर इंगित करता है या नहीं?
- 6. जांचें कि कोई चर mysqli ऑब्जेक्ट प्रकार है या नहीं?
- 7. मैं कैसे जांचूं कि सरणी मान खाली है या नहीं?
- 8. मैं कैसे जांचूं कि किसी सूची में किसी निश्चित प्रकार का ऑब्जेक्ट है या नहीं? सी #
- 9. मैं कैसे जांचूं कि कोई उपयोगकर्ता 'इनपुट' या 'raw_input' प्रॉम्प्ट खाली छोड़ देता है या नहीं?
- 10. मैं कैसे जांचूं कि टेम्पलेट पैरामीटर दो की शक्ति है या नहीं?
- 11. क्यों संरचना में पैरामीटर रहित कन्स्ट्रक्टर नहीं हो सकता
- 12. में सार्वजनिक पैरामीटर रहित कन्स्ट्रक्टर होना चाहिए, है ना?
- 13. मैं कैसे जांचूं कि मूल्य
- 14. मैं कैसे जांचूं कि वेब.कॉन्फिग
- 15. इस ऑब्जेक्ट के लिए कोई पैरामीटर रहित कन्स्ट्रक्टर परिभाषित नहीं किया गया है। एएसपी.नेट एमवीसी नियंत्रक
- 16. पैरामीटर रहित कन्स्ट्रक्टर्स
- 17. सिस्टम। MissingMethodException: इस ऑब्जेक्ट के लिए कोई पैरामीटर रहित कन्स्ट्रक्टर परिभाषित नहीं है। एमवीसी 4
- 18. मैं कैसे जांचूं कि एक इंटरफेस्ड ऑब्जेक्ट किसी अन्य इंटरफ़ेस को लागू करता है या नहीं?
- 19. इस ऑब्जेक्ट के लिए कोई पैरामीटर रहित कन्स्ट्रक्टर परिभाषित नहीं किया गया है। केंडो ग्रिड
- 20. मैं कैसे जांचूं कि SQL सर्वर में कोई कॉलम मौजूद है या नहीं?
- 21. मैं कैसे जांचूं कि कोई संख्या अनंतता का मूल्यांकन करती है या नहीं?
- 22. मैं कैसे जांचूं कि रिकॉर्ड में कोई कुंजी मौजूद है या नहीं?
- 23. , मैं कैसे जांचूं कि कोई तत्व दिखाई दे रहा है या नहीं?
- 24. मैं कैसे जांचूं कि कोई निर्देशिका SQL सर्वर का उपयोग कर मौजूद है या नहीं?
- 25. मैं कैसे जांचूं कि एक्सएसएलटी में कोई टैग मौजूद है या नहीं?
- 26. आईओएस - मैं कैसे जांचूं कि कोई स्ट्रिंग संख्यात्मक है या नहीं?
- 27. मैं कैसे जांचूं कि MySQL में किसी तालिका फ़ील्ड पर कोई अनुक्रमणिका मौजूद है या नहीं?
- 28. मैं कैसे जांचूं कि कोई ऑब्जेक्ट NSMutableArray की किसी निश्चित अनुक्रमणिका में मौजूद है या नहीं?
- 29. मैं कैसे जांचूं कि कोई सूची सॉर्ट की गई है या नहीं?
- 30. Django में, मैं कैसे जांचूं कि कोई उपयोगकर्ता किसी निश्चित समूह में है या नहीं?
मुझे लगता है कि यह सही है – kenny
Sidenote: पैरामीटर रहित रचनाकारों के लिए एक सामान्य बाधा है। – CodesInChaos
सवाल यह है कि टाइप ** केवल ** पैरामीटर रहित कन्स्ट्रक्टर प्रदान करता है या यदि यह बिल्कुल एक प्रदान करता है? बाद में – BrokenGlass