2010-02-19 11 views
15

Type के लिए, सी # में IsClass एक संपत्ति है, लेकिन Type एक संरचना कैसे तय करें?एक प्रकार का निर्णय कैसे लें एक कस्टम संरचना है?

हालांकि IsValueType एक आवश्यक शर्त है, यह स्पष्ट रूप से पर्याप्त नहीं है। int के लिए एक वैल्यू प्रकार भी है।

किसी निम्न कोड पता चलता है:

bool IsStruct = type.IsValueType && !type.IsEnum && !type.IsPrimitive; 

लेकिन मुझे यकीन है कि यह एक सटीक तरीका है कि क्या नहीं कर रहा हूँ। सूत्र को संरचना और अन्य प्रकारों जैसे DateTime, int और array एस के बीच अंतर बता देना चाहिए।

जैसा कि कुछ दोस्तों ने इंगित किया है कि मेरा मतलब है, मेरा मतलब है उपयोगकर्ता परिभाषित संरचना और पूर्वनिर्धारित प्रकार, जैसे कि DateTime

+2

मुझे यकीन नहीं है कि मैं सवाल समझता हूं। एक डेटटाइम ** ** एक संरचना है। तुम वहाँ झूठी क्यों लौटोगे? –

+3

वास्तव में int एक संरचना प्रकार भी है। भाषा विनिर्देश बताता है "सी # सरल प्रकार नामक पूर्वनिर्धारित संरचना प्रकारों का एक सेट प्रदान करता है"। –

+2

यह जानना दिलचस्प होगा कि आप क्यों परवाह करते हैं। तुम क्या कर रहे हो? आप जो चाहते हैं उसे करने का एक बेहतर तरीका हो सकता है। –

उत्तर

8

तकनीकी रूप से, एक int भी एक संरचना है। Isprrimitive सिर्फ जांचता है कि यह प्रकार सीएलआर को अलग-अलग प्रकार के एक प्राचीन प्रकार में से एक है। आपको सुझाव IsValueType && !IsEnum && !IsPrimitive के साथ ठीक होना चाहिए।

यदि आप केवल कस्टम structs (यानी बीसीएल द्वारा प्रदान नहीं किए गए) चाहते हैं, तो आप "System." से शुरू होने वाले भाग्य को छोड़कर भाग्य प्राप्त कर सकते हैं, या केवल उन लोगों को शामिल कर सकते हैं जिन्हें आप असेंबली या नेमस्पेस द्वारा फ़िल्टर करके रुचि रखते हैं , या एक कस्टम विशेषता का उपयोग करें।

+2

+1 या '" माइक्रोसॉफ्ट। "' या '" FSharp। "' या। । । मुझे लगता है कि उन्हें उन सभी को खत्म करने में मुश्किल होगी। –

2

होना चाहिए कम से कम

bool isStruct = type.IsValueType && !type.IsEnum && 
       !type.IsPrimitive && type != typeof(decimal); 
0

आप इस के साथ एक मुश्किल समय है करने के लिए जा रहे हैं। बेस फ्रेमवर्क को पता नहीं है कि फ्रेमवर्क के अन्य हिस्सों में सभी पूर्वनिर्धारित प्रकार क्या हैं। कोर फ्रेमवर्क को उदाहरण के लिए System.Drawing.Point के बारे में जानने की अपेक्षा करना अनुचित है।

ओरेगॉनहोस्ट शायद सबसे अच्छा answer है: टाइप जानकारी प्राप्त करें और से शुरू होने पर यह देखने के लिए FullName संपत्ति देखें। लेकिन आपको "Microsoft." और "FSharp", और संभवतः अन्य लोगों की जांच करने की आवश्यकता होगी। विजुअल स्टूडियो में बस "एक संदर्भ जोड़ें" पर क्लिक करें, और देखें कि कौन से नाम आते हैं।

और फिर आप को बहुत अधिक अवरुद्ध करने का जोखिम हो सकता है। माइक्रोसॉफ्ट NuGet संकुल के माध्यम से कुछ असेंबली वितरित करता है, और उन असेंबली के प्रकारों में अक्सर ऐसे नाम होते हैं जो "System." या "Microsoft." से शुरू होते हैं क्या आप उन "अंतर्निहित" प्रकारों पर विचार करते हैं, भले ही वे फ्रेमवर्क के साथ वितरित न हों?

1

http://msdn.microsoft.com/en-us/library/bfft1t3c.aspx का कहना है: IsValueType सच है अगर प्रकार {bool, बाइट, चार, दशमलव, डबल, enum, नाव, पूर्णांक, लंबे, sbyte, लघु, struct, uint, Ulong, ushort} में है।

http://msdn.microsoft.com/en-us/library/system.type.isprimitive%28v=vs.110%29.aspx का कहना है: IsPrimitive सच है अगर प्रकार में है {बूलियन, बाइट, SByte, int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, चार, डबल, और एकल}।

से IsStruct के लिए आप इस तरह विधि का उपयोग कर सकते हैं:!

public static bool IsStruct(this Type type) 
{ 
    return type.IsValueType 
      && !type.IsPrimitive 
      && !type.IsEnum 
      && type != typeof(decimal); 
} 
0

यह मेरे लिए काम किया x.PropertyType.IsSecurityTransparent & & एक्स।PropertyType.IsClass

0

नहीं एक आदर्श समाधान है, लेकिन आप हमेशा विधानसभाओं के भीतर जाना जाता है प्रकार के द्वारा खोज को सीमित करने पर विचार कर सकते हैं खोज करना चाहते हैं:

System.Reflection.Assembly.GetAssembly(tyepof(OneOfMyTypes)) 
    .GetExportedTypes() 
    .Where(t => t.IsValueType); 

को खत्म झूठे सकारात्मक (? सुरक्षित) में मदद करता है, लेकिन यह है कम पोर्टेबल।

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