2009-07-11 25 views
5

मैं देखना चाहता हूं कि कोई ऑब्जेक्ट builtin data type सी #क्या कोई ऑब्जेक्ट जांचने के लिए कोई फ़ंक्शन है कि कोई ऑब्जेक्ट एक बिल्टिन डेटा प्रकार है या नहीं?

यदि संभव हो तो मैं उन सभी के खिलाफ जांचना नहीं चाहता हूं।
है कि, मैं नहीं ऐसा करने के लिए करना चाहते हैं :

 Object foo = 3; 
     Type type_of_foo = foo.GetType(); 
     if (type_of_foo == typeof(string)) 
     { 
      ... 
     } 
     else if (type_of_foo == typeof(int)) 
     { 
      ... 
     } 
     ... 

अद्यतन

मैं रिकर्सिवली एक PropertyDescriptorCollection जहां PropertyDescriptor प्रकार मूल्यों builtin नहीं किया जा सकता बनाने के लिए कोशिश कर रहा हूँ। तो मैं इस तरह कुछ करना चाहता था (ध्यान दें: यह अभी तक काम नहीं करता है, लेकिन मैं इस पर काम कर रहा हूँ):

public override PropertyDescriptorCollection GetProperties(Attribute[] attributes) 
    { 
     PropertyDescriptorCollection cols = base.GetProperties(attributes); 

     List<PropertyDescriptor> list_of_properties_desc = CreatePDList(cols); 
     return new PropertyDescriptorCollection(list_of_properties_desc.ToArray()); 
    } 

    private List<PropertyDescriptor> CreatePDList(PropertyDescriptorCollection dpCollection) 
    { 
     List<PropertyDescriptor> list_of_properties_desc = new List<PropertyDescriptor>(); 
     foreach (PropertyDescriptor pd in dpCollection) 
     { 
      if (IsBulitin(pd.PropertyType)) 
      { 
       list_of_properties_desc.Add(pd); 
      } 
      else 
      { 
       list_of_properties_desc.AddRange(CreatePDList(pd.GetChildProperties())); 
      } 
     } 
     return list_of_properties_desc; 
    } 

    // This was the orginal posted answer to my above question 
    private bool IsBulitin(Type inType) 
    { 
     return inType.IsPrimitive || inType == typeof(string) || inType == typeof(object); 
    } 

उत्तर

5

अच्छा, एक आसान तरीका यह है कि उन्हें केवल एक सेट में स्पष्ट रूप से सूचीबद्ध करना है, उदा।

static readonly HashSet<Type> BuiltInTypes = new HashSet<Type> 
    (typeof(object), typeof(string), typeof(int) ... }; 

... 


if (BuiltInTypes.Contains(typeOfFoo)) 
{ 
    ... 
} 

मैं क्यों यह हालांकि महत्वपूर्ण है पूछने के लिए - मैं समझ सकता है अगर यह एक .NET primitive type है कि यह कैसे एक फर्क सकता है, लेकिन क्या आप क्यों अपने आवेदन अलग तरीके से व्यवहार करने के लिए करता है, तो इसके लिए लोगों में से एक है चाहेगा समझा सकता है सी # खुद? क्या यह एक विकास उपकरण के लिए है?

उस प्रश्न का उत्तर के आधार पर आप सी # 4 में dynamic के साथ स्थिति पर विचार करना चाहते हो सकता है - जो इस तरह के रूप में निष्पादन समय में एक प्रकार की नहीं है, लेकिन जब एक विधि पैरामीटर के लिए आदि लागू किया System.Object + एक विशेषता है ।

+0

मैं रिकर्सिवली एक PropertyDescriptorCollection बनाना चाहता था और मैं अगर प्रकार builtin है या नहीं की जाँच करने की जरूरत है। यदि कोई गुण एक बिल्टिन प्रकार नहीं था तो मैं एक नया संग्रह बनाना चाहता था। बीमार इम प्रश्न में क्या करने की कोशिश कर क्या, हो सकता है कि आपकी मदद करेंगे – SwDevMan81

+0

लेकिन क्यों कि निर्णय सी # विनिर्देश पर आधारित होगा जोड़ सकता हूँ?आप डेसिमल को एक तरह से क्यों व्यवहार करना चाहते हैं, लेकिन डेटटाइम या गुइड एक अलग तरीके से क्यों? –

+0

ठीक है, यह नहीं होना चाहिए, यह मेरे हिस्से पर एक निरीक्षण था। सिस्टम। वैल्यू टाइप की भी जांच की जानी चाहिए। – SwDevMan81

9

सीधे नहीं लेकिन आप निम्नलिखित सरल जांच कर सकते हैं

public bool IsBulitin(object o) { 
    var type = o.GetType(); 
    return (type.IsPrimitive && type != typeof(IntPtr) && type != typeof(UIntPtr)) 
     || type == typeof(string) 
     || type == typeof(object) 
     || type == typeof(Decimal); 
} 

IsPrimitive चेक स्ट्रिंग, ऑब्जेक्ट और दशमलव के अलावा सबकुछ पकड़ लेगा।

संपादित

इस विधि काम करता है, मैं जॉन के समाधान पसंद करेंगे। कारण सरल है, मेरे समाधान में किए गए संपादन की संख्या की जांच करें क्योंकि मैं भूल गए प्रकार या प्राइमेटिव नहीं थे। बस एक सेट में स्पष्ट रूप से उन्हें बाहर सूचीबद्ध करने के लिए आसान है।

+0

@Jon सिर्फ अपनी टिप्पणी से पहले अद्यतन में चोरी;) – JaredPar

+1

तुम भी इसके लिए जाँच करना चाहते हैं * नहीं * IntPtr, किया जा रहा है जो आदिम है लेकिन अंतर्निहित नहीं है। यही कारण है कि मैं इस पद्धति पर बहुत उत्सुक नहीं कर रहा हूँ है - आप, दो सूचियों की तुलना और मतभेदों को दूर काम करने की जरूरत है, जबकि एक स्पष्ट सेट सिर्फ सी # कल्पना से शब्दशः सूची को कॉपी का मतलब है :) –

+0

@Jared: इसलिए को हटाने मेरी टिप्पणी :) (जो लोग इसे पकड़ने के लिए ऐसा नहीं हुआ, तो जारेड का जवाब शुरू में दशमलव शामिल नहीं किया। मैंने टिप्पणी की, जबकि वह उसे ठीक करने गया था ...) दरअसल –

1

मुझे लगता है कि यह सबसे अच्छा possibilies में से एक है:

private static bool IsBulitinType(Type type) 
{ 
    return (type == typeof(object) || Type.GetTypeCode(type) != TypeCode.Object); 
}