सी # 3.0 में है, तो यह निर्धारित करना संभव है कि Type
का उदाहरण अज्ञात प्रकार का प्रतिनिधित्व करता है या नहीं?यह निर्धारित करना कि कोई प्रकार बेनामी प्रकार
उत्तर
हालांकि एक गुमनाम प्रकार एक साधारण प्रकार है, तो आप कुछ शोध प्रणालियों का उपयोग कर सकते हैं:
public static class TypeExtension {
public static Boolean IsAnonymousType(this Type type) {
Boolean hasCompilerGeneratedAttribute = type.GetCustomAttributes(typeof(CompilerGeneratedAttribute), false).Count() > 0;
Boolean nameContainsAnonymousType = type.FullName.Contains("AnonymousType");
Boolean isAnonymousType = hasCompilerGeneratedAttribute && nameContainsAnonymousType;
return isAnonymousType;
}
}
एक और अच्छा अनुमानी प्रयोग की जाने वाली है अगर वर्ग के नाम एक वैध सी # नाम है (अनाम प्रकार कोई साथ उत्पन्न कर रहे हैं मान्य सी # कक्षा के नाम - इसके लिए नियमित अभिव्यक्ति का उपयोग करें)।
+ 1 अच्छा जवाब। –
@ फिलिप लेकिन मूर्ख-प्रमाण नहीं, इस सवाल को देखें। –
@MattWarren, कौन सा सवाल? –
मेथाडाटा और सीएलआर में अनाम प्रकारों जैसी कोई शर्तें नहीं हैं। बेनामी प्रकार पूरी तरह से कंपाइलर सुविधा हैं।
यह जानकर सहायक हो सकता है कि आप यह क्यों जानना चाहते हैं। आप निम्नलिखित निष्पादित हैं:
var myType = new { Name = "Bill" };
Console.Write(myType.GetType().Name );
... आप की तरह "<> f__AnonymousType0`1" प्रकार नाम के रूप में उत्पादन कुछ देखना होगा। आपकी आवश्यकताओं के आधार पर, आप यह मान सकते हैं कि <> से शुरू होने वाला एक प्रकार, जिसमें "बेनामी टाइप" और बैक कोट चरित्र शामिल है, जिसे आप ढूंढ रहे हैं।
क्यों चिंता न करें। यह जिज्ञासा है :) – xyz
मैंने एक ही बात सोचा, लेकिन यह थोड़ा गंदा है। क्या होगा यदि वे सी # 5 में नाम बदलते हैं? इसका उपयोग करने वाला कोई भी कोड टूटा जाएगा। –
पूछना और समझना महत्वपूर्ण है कि "क्यों" कारण अक्सर अन्य संभावित उत्तर होते हैं जो अधिक जानने के बिना प्रश्न से स्पष्ट नहीं हो सकते हैं। –
ऐसा लगता है कि अनाम प्रकार DebuggerDisplayAttribute
उन्हें Type = "<Anonymous Type>"
पर डालते हैं।
संपादित करें: लेकिन केवल तभी जब आप डीबग मोड में संकलित करते हैं। अरे।
रिलीज में भी निर्माण? –
कोई सी # भाषा निर्माण नहीं है जो आपको "यह एक अनाम प्रकार है" कहने की अनुमति देता है। यदि आप एक प्रकार का गुमनाम प्रकार है, तो अनुमान लगाने के लिए आप एक साधारण ह्युरिस्टिक का उपयोग कर सकते हैं, लेकिन आईएल कोडिंग करने वाले लोगों द्वारा धोखा दिया जा सकता है, या ऐसी भाषा का उपयोग करना जहां > और < जैसे वर्ण पहचानकर्ताओं में मान्य हैं।
public static class TypeExtensions {
public static bool IsAnonymousType(this Type t) {
var name = t.Name;
if (name.Length < 3) {
return false;
}
return name[0] == '<'
&& name[1] == '>'
&& name.IndexOf("AnonymousType", StringComparison.Ordinal) > 0;
}
एक गुमनाम टाइप वस्तु
- के गुण एक namespace बराबर System.Object
- IsSealed = सच
- कस्टम विशेषता 0 DebuggerDisplayAttribute है, प्रकार की
- आधार प्रकार शून्य पर है : ""
- IsPublic = false
मेरे विशेष एप्लिकेशन के लिए, यदि नामस्थान शून्य है तो यह अनुमान लगाया जा सकता है कि प्रकार अज्ञात है, इसलिए यह जांचना कि नामस्थान शून्य है, शायद कम से कम महंगी जांच है।
धन्यवाद, वापसी प्रकार का चयन करना। नामस्थान == शून्य; लगभग 50% तक मेरे कार्यक्रमों की प्रसंस्करण में सुधार हुआ (इस दृष्टिकोण का उपयोग कर रहा था: http://stackoverflow.com/questions/2483023/how-to-test-if-a-type-is-anonymous) – Schalk
हाँ। यह सही जवाब होना चाहिए। मुझे नहीं लगता कि किसी भी उचित ठोस वर्ग में कभी भी शून्य नामस्थान होगा। –
+1 धन्यवाद! इस उत्तर को पसंदीदा बनाने के लिए यहां मेरी टिप्पणी छोड़कर (केवल एक धागा नहीं) –
- 1. क्या यह निर्धारित करना संभव है कि कोई प्रकार एक स्कॉम्ड गणना प्रकार है या नहीं?
- 2. बेनामी प्रकार
- 3. बेनामी प्रकार
- 4. निर्धारित करें कि कोई प्रकार स्थिर है
- 5. सी # बेनामी प्रकार
- 6. यह निर्धारित करना कि कोई फ़ोल्डर .NET
- 7. यह निर्धारित करने के लिए कि कोई प्रकार संग्रह का प्रकार है या नहीं?
- 8. बेनामी प्रकार संपत्ति सेटर्स
- 9. बेनामी प्रकार और ट्यूपल
- 10. LINQ बेनामी प्रकार + एमवीसी दृश्य
- 11. बेनामी प्रकार रियल कक्षा पुनर्रचना
- 12. यह निर्धारित करना कि कोई उद्देश्य-सी विधि रनटाइम
- 13. यह निर्धारित करना कि छवि
- 14. यह निर्धारित करना कि stringByEvaluatingJavaScriptFromString
- 15. फ़ंक्शन से बेनामी प्रकार वापसी
- 16. यह निर्धारित करना कि कोई पावरहेल कमांड सफल हुआ था
- 17. जांचें कि कोई प्रकार इंटरफ़ेस
- 18. SFINAE - यह निर्धारित करने का प्रयास कर रहा है कि टेम्पलेट प्रकार में 'चर' रिटर्न प्रकार
- 19. विधि से बेनामी प्रकार वापस करने का कोई तरीका है?
- 20. अभिव्यक्ति के प्रकार को निर्धारित करना
- 21. एएसपी.नेट, सी # और बेनामी प्रकार - मैन्युअल रूप से बेनामी टाइप
- 22. यह निर्धारित करें कि संग्रह प्रकार का प्रकार है INumerable <T>
- 23. रनटाइम-निर्धारित प्रकार
- 24. जांचना कि कोई प्रकार किसी अन्य प्रकार के निहित या स्पष्ट प्रकार रूपांतरण को .NET
- 25. यह निर्धारित करने के लिए कि कोई .NET प्रकार कस्टम संरचना है या नहीं?
- 26. यह जांचने के लिए कि कोई ऑब्जेक्ट किसी निश्चित प्रकार
- 27. यह पता लगाना कि कोई प्रकार एक सामान्य इंटरफ़ेस
- 28. ग्रहण 'बेनामी इनर प्रकार' - स्वत: पूर्ण
- 29. यह निर्धारित करना कि कोई प्रिंटर बिना प्रिंट-अप
- 30. यह निर्धारित करना कि कोई व्युत्पन्न वर्ग बेस क्लास
उत्तर भी देखें: http://stackoverflow.com/a/315186/46039 –