2008-08-31 14 views
10

से मैं किसी ऑब्जेक्ट के गुणों के आधार पर डेटासेट बनाने का प्रयास कर रहा हूं। उदाहरण के लिए, मैं आईडी, पूर्व नाम, उपनाम, जन्म तिथि आदि सहित गुण प्रतिबिंब का उपयोग के साथ एक व्यक्ति वर्ग का एक उदाहरण है, मैं वस्तु गुणों के आधार पर एक नया डाटासेट में कॉलम जोड़ने हूँ:वीबीएनईटी अंतर्निहित सिस्टम प्राप्त करें। टाइप करने योग्य प्रकार

For Each pi As PropertyInfo In person.GetType().GetProperties() 
    Dim column As New DataColumn(pi.Name, pi.PropertyType) 
    table.Columns.Add(column) 
Next 

मेरे समस्या यह है कि उनमें से कुछ प्रस्ताव निरर्थक प्रकार हैं जो डेटासेट द्वारा समर्थित नहीं हैं। अंतर्निहित सिस्टम प्रकार को एक शून्य प्रकार से निकालने का कोई तरीका है?

धन्यवाद।

उत्तर

1

मुझे लगता है कि समस्या यह पहचान रही है कि संपत्ति शून्य है या नहीं। सी # में आप इस कोड के साथ ऐसा करते हैं:

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) 

... लेकिन मुझे यकीन है कि क्या है कि पिछले खंड के बराबर VB.NET में है नहीं कर रहा हूँ।

+0

अगर (टाइप.इसेजनेरिक टाइप और एस्सो टाइप। गेटजेनरिक टाइप टाइपिफ़िशन गेट टाइप (न्यूबलबल) है –

+0

यह वास्तव में वीबी के लिए सही अनुवाद नहीं है, विचित्र रूप से पर्याप्त है। मेरा जवाब देखें। –

+0

हां, 'शून्य 'और' शून्य '<> दो अलग-अलग प्रकार हैं। –

0

@Mendelt Siebenga: यदि आप चर को शून्य पर सेट नहीं करते हैं तो आप केवल वैल्यू प्रॉपर्टी पर GetType को कॉल कर सकते हैं; अन्यथा, आपको अपवाद मिलेगा।

आप क्या करना चाहते हैं "GetValueOrDefault" संपत्ति का उपयोग करें और उस पर GetType को कॉल करें, क्योंकि आप गारंटी देते हैं कि यह शून्य नहीं होगा। उदाहरण:

Dim i As Nullable(Of Integer) = Nothing 
Dim t As Type = i.GetValueOrDefault().GetType() 
2

आप उस प्रकार के GetGenericParameters() विधि का भी उपयोग कर सकते हैं। myNullableObject.GetType().GetGenericParameters()[0] आपको यह शून्य प्रकार का होना चाहिए (इसलिए Guid, Int32, आदि)

15

यहां आपका उत्तर है, वीबी में। यह आपके उद्देश्यों के लिए अधिक हो सकता है, लेकिन यह कुछ अन्य लोगों के लिए भी उपयोगी हो सकता है।

Private Function IsNullableType(ByVal myType As Type) As Boolean 
    Return (myType.IsGenericType) AndAlso (myType.GetGenericTypeDefinition() Is GetType(Nullable(Of))) 
End Function 

नोट GetType में असामान्य वाक्य रचना:

सबसे पहले, यहाँ पता लगाने के लिए अगर आप एक Nullable प्रकार साथ काम कर रहे कोड है। यह जरुरी है। बस GetType (Nullable) कर रहा है क्योंकि सुझावों में से एक ने सुझाव दिया कि मेरे लिए काम नहीं किया।

तो, कि के साथ सशस्त्र, आप कुछ इस तरह कर सकते हैं ... यहाँ, एक ORM उपकरण में, मैं एक सामान्य प्रकार है कि या Nullable नहीं हो सकता है में मूल्यों को प्राप्त करने के लिए कोशिश कर रहा हूँ:

If (Not value Is Nothing) AndAlso IsNullableType(GetType(T)) Then 
    Dim UnderlyingType As Type = Nullable.GetUnderlyingType(GetType(T)) 
    Me.InnerValue = Convert.ChangeType(value, UnderlyingType) 
Else 
    Me.InnerValue = value 
End If 

ध्यान दें कि मैं पहली पंक्ति में कुछ भी नहीं ढूंढता क्योंकि कनवर्ट करें। चेंजटाइप इस पर चकित होगा ... आपको वह समस्या नहीं हो सकती है, लेकिन मेरी स्थिति बेहद खुली है।

उम्मीद है कि अगर मैंने सीधे आपके प्रश्न का उत्तर नहीं दिया है, तो आप इसे रद्द कर सकते हैं और आपको वहां जाने की आवश्यकता है - लेकिन मैंने अभी इस क्षण को लागू किया है, और मेरे परीक्षण सभी गुजर रहे हैं।

+0

वह जो भी मांगता था वह अंतर्निहित प्रकार था, इसलिए आपको जो कुछ चाहिए वह शून्य है। GetUnderlyingType। –

+0

मुझे संदेह है कि वह इसे अधिकतर की आवश्यकता समाप्त कर देगा।:) –

+0

उत्कृष्ट पोस्ट, मेरे गधे को बचाया! – tbone

4
Nullable.GetUnderylingType(myType) 

अंतर्निहित प्रकार या शून्य को वापस कर देगा यदि यह एक शून्य प्रकार नहीं है।

+0

बहुत बढ़िया, धन्यवाद! सी # में मैं प्राप्त करने में सक्षम नहीं था ... टाइप करने के लिए टाइपफुल (Nullable <>) 'है (मैं बाद में क्यों पता लगाऊंगा), इसलिए यह पूरी तरह से मेरे माथे को बार-बार सिर/डेस्क इंटरैक्शन से बचाया। अन्य समाधानों की तुलना में सरल। – Groxx

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