2009-10-30 18 views
21

सी # 3.0 में है, तो यह निर्धारित करना संभव है कि Type का उदाहरण अज्ञात प्रकार का प्रतिनिधित्व करता है या नहीं?यह निर्धारित करना कि कोई प्रकार बेनामी प्रकार

+0

उत्तर भी देखें: http://stackoverflow.com/a/315186/46039 –

उत्तर

35

हालांकि एक गुमनाम प्रकार एक साधारण प्रकार है, तो आप कुछ शोध प्रणालियों का उपयोग कर सकते हैं:

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

+ 1 अच्छा जवाब। –

+0

@ फिलिप लेकिन मूर्ख-प्रमाण नहीं, इस सवाल को देखें। –

+1

@MattWarren, कौन सा सवाल? –

2

मेथाडाटा और सीएलआर में अनाम प्रकारों जैसी कोई शर्तें नहीं हैं। बेनामी प्रकार पूरी तरह से कंपाइलर सुविधा हैं।

1

यह जानकर सहायक हो सकता है कि आप यह क्यों जानना चाहते हैं। आप निम्नलिखित निष्पादित हैं:

var myType = new { Name = "Bill" }; 
Console.Write(myType.GetType().Name ); 

... आप की तरह "<> f__AnonymousType0`1" प्रकार नाम के रूप में उत्पादन कुछ देखना होगा। आपकी आवश्यकताओं के आधार पर, आप यह मान सकते हैं कि <> से शुरू होने वाला एक प्रकार, जिसमें "बेनामी टाइप" और बैक कोट चरित्र शामिल है, जिसे आप ढूंढ रहे हैं।

+0

क्यों चिंता न करें। यह जिज्ञासा है :) – xyz

+0

मैंने एक ही बात सोचा, लेकिन यह थोड़ा गंदा है। क्या होगा यदि वे सी # 5 में नाम बदलते हैं? इसका उपयोग करने वाला कोई भी कोड टूटा जाएगा। –

+0

पूछना और समझना महत्वपूर्ण है कि "क्यों" कारण अक्सर अन्य संभावित उत्तर होते हैं जो अधिक जानने के बिना प्रश्न से स्पष्ट नहीं हो सकते हैं। –

1

ऐसा लगता है कि अनाम प्रकार DebuggerDisplayAttribute उन्हें Type = "<Anonymous Type>" पर डालते हैं।

संपादित करें: लेकिन केवल तभी जब आप डीबग मोड में संकलित करते हैं। अरे।

+0

रिलीज में भी निर्माण? –

5

कोई सी # भाषा निर्माण नहीं है जो आपको "यह एक अनाम प्रकार है" कहने की अनुमति देता है। यदि आप एक प्रकार का गुमनाम प्रकार है, तो अनुमान लगाने के लिए आप एक साधारण ह्युरिस्टिक का उपयोग कर सकते हैं, लेकिन आईएल कोडिंग करने वाले लोगों द्वारा धोखा दिया जा सकता है, या ऐसी भाषा का उपयोग करना जहां > और < जैसे वर्ण पहचानकर्ताओं में मान्य हैं।

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; 
} 
14

एक गुमनाम टाइप वस्तु

  • के गुण एक namespace बराबर System.Object
  • IsSealed = सच
  • कस्टम विशेषता 0 DebuggerDisplayAttribute है, प्रकार की
  • आधार प्रकार शून्य पर है : ""
  • IsPublic = false

मेरे विशेष एप्लिकेशन के लिए, यदि नामस्थान शून्य है तो यह अनुमान लगाया जा सकता है कि प्रकार अज्ञात है, इसलिए यह जांचना कि नामस्थान शून्य है, शायद कम से कम महंगी जांच है।

+1

धन्यवाद, वापसी प्रकार का चयन करना। नामस्थान == शून्य; लगभग 50% तक मेरे कार्यक्रमों की प्रसंस्करण में सुधार हुआ (इस दृष्टिकोण का उपयोग कर रहा था: http://stackoverflow.com/questions/2483023/how-to-test-if-a-type-is-anonymous) – Schalk

+0

हाँ। यह सही जवाब होना चाहिए। मुझे नहीं लगता कि किसी भी उचित ठोस वर्ग में कभी भी शून्य नामस्थान होगा। –

+0

+1 धन्यवाद! इस उत्तर को पसंदीदा बनाने के लिए यहां मेरी टिप्पणी छोड़कर (केवल एक धागा नहीं) –

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