कैसे जांचें कि कोई वस्तु एक निश्चित प्रकार है


102

मैं एक ही प्रक्रिया को चलाने के लिए विभिन्न वस्तुओं को पास कर रहा हूं लेकिन हर बार एक अलग वस्तु का उपयोग कर रहा हूं। उदाहरण के लिए, एक मामले में मैं एक सूची दृश्य का उपयोग कर रहा हूं और दूसरे मामले में मैं ड्रॉपडाउनलिस्ट से गुजर रहा हूं।

मैं जांचना चाहता हूं कि क्या पास की जा रही वस्तु ड्रॉपडाउनलिस्ट है तो कुछ कोड निष्पादित करें यदि यह है। मैं यह कैसे करु?

मेरा अब तक का कोड जो काम नहीं करता है:

Sub FillCategories(ByVal Obj As Object)
    Dim cmd As New SqlCommand("sp_Resources_Categories", Conn)
    cmd.CommandType = CommandType.StoredProcedure
    Obj.DataSource = cmd.ExecuteReader
    If Obj Is System.Web.UI.WebControls.DropDownList Then

    End If
    Obj.DataBind()
End Sub

जवाबों:


159

VB.NET में, आपको किसी ऑब्जेक्ट के प्रकार को पुनर्प्राप्त करने के लिए GetTypeविधि का उपयोग करने की आवश्यकता है , और GetType()ऑपरेटर को किसी अन्य ज्ञात प्रकार के प्रकार को पुनः प्राप्त करने के लिए।

एक बार जब आपके पास दो प्रकार होते हैं, तो आप बस Isऑपरेटर का उपयोग करके उनकी तुलना कर सकते हैं ।

तो आपका कोड वास्तव में इस तरह लिखा जाना चाहिए:

Sub FillCategories(ByVal Obj As Object)
    Dim cmd As New SqlCommand("sp_Resources_Categories", Conn)
    cmd.CommandType = CommandType.StoredProcedure
    Obj.DataSource = cmd.ExecuteReader
    If Obj.GetType() Is GetType(System.Web.UI.WebControls.DropDownList) Then

    End If
    Obj.DataBind()
End Sub

आप विधि के बजाय TypeOfऑपरेटर का भी उपयोग कर सकते हैं GetType। ध्यान दें कि यह परीक्षण यदि आपकी वस्तु दिए गए प्रकार के साथ संगत है , न कि यह उसी प्रकार की है। यह इस तरह दिखेगा:

If TypeOf Obj Is System.Web.UI.WebControls.DropDownList Then

End If

पूरी तरह से तुच्छ, अप्रासंगिक नाइटिक: परंपरागत रूप से, मापदंडों के नाम ऊँट वाले होते हैं (जिसका अर्थ है कि वे हमेशा लो-केस अक्षर से शुरू होते हैं) .NET कोड लिखते समय (या तो VB.NET या C #)। इससे उन्हें कक्षाओं, प्रकारों, विधियों आदि से एक नज़र में अंतर करना आसान हो जाता है।


1
आपके उत्तर के लिए धन्यवाद। मैंने उस कोड की कोशिश की, लेकिन वास्तव में एकमात्र चीज यह है कि यह '=' ऑपरेटर के साथ काम नहीं करता है। मुझे इसे to इज़ ’में बदलना पड़ा। त्रुटि तब हुई जब मैं '=' ​​था "ऑपरेटर" = प्रकार के लिए परिभाषित नहीं है 'System.Type' और 'System.Type'। "
लिआह

1
@ हाँ: हाँ, इस बारे में क्षमा करें। लगता है कि मुझे उत्तर लिखते समय अधिक ध्यान देना शुरू करना चाहिए। TypeOfसंभवतः कोड पठनीयता के संदर्भ में कम से कम एक सरल विकल्प है; मैंने इसका एक उदाहरण के साथ उत्तर भी अपडेट किया है।
कोड़ी ग्रे

35
दोनों के बीच एक महत्वपूर्ण अंतर है, जो मुझे इस पद तक ले गया। टाइपऑफ चेक सही लौटेगा यदि वस्तु एक वर्ग की है जो उस प्रकार से विरासत में मिला है जिसके खिलाफ आप जांच कर रहे हैं, जबकि गेटटाइप केवल सही लौटेगा यदि यह ठीक उसी वर्ग है।
अबेकस

पूरी तरह से तुच्छ, अप्रासंगिक प्रतिवाद : भले ही वीएस कोडअनलिसिस की शिकायत हो, फिर भी मुझे लगता है कि तर्क नाम सार्वजनिक इंटरफ़ेस का हिस्सा हैं और इसलिए मेरे कोड में पास्कलकेस हैं।
मार्क हर्ड

क्या दोनों के बीच एक प्रदर्शन अंतर है? - Select Case (Obj.GetType())कई परीक्षण मामलों बनाम कई के बारे में क्या IF TypeOf Obj is ...?
ल्यूक टी ओ'ब्रायन

3

कोडी ग्रे से प्रतिक्रिया के संबंध में कुछ और विवरण। जैसा कि मुझे इसे पचाने में कुछ समय लगा, हालांकि यह दूसरों के लिए उपयोगी हो सकता है।

सबसे पहले, कुछ परिभाषाएँ:

  1. TypeNames हैं, जो किसी ऑब्जेक्ट, इंटरफ़ेस आदि के प्रकार के स्ट्रिंग निरूपण हैं। उदाहरण के लिए, Barएक TypeName in Public Class Barया in है Dim Foo as Bar। टाइपनाम को संकलक के रूप में "लेबल" के रूप में देखा जा सकता है जो संकलक को यह बताने के लिए कि किस प्रकार की डिक्शनरी को एक शब्दकोश में देखना है जहाँ सभी उपलब्ध प्रकारों का वर्णन किया जाएगा।
  2. ऐसी System.Typeवस्तुएँ हैं जिनमें एक मान होता है। यह मान एक प्रकार को इंगित करता है; जैसे Stringकुछ पाठ या Intएक नंबर लेगा, वैसे ही हम पाठ या संख्या के बजाय प्रकार संग्रह कर रहे हैं। Typeऑब्जेक्ट में टाइप परिभाषाएँ होती हैं, साथ ही इसके संबंधित टाइपनाम भी होते हैं।

दूसरा, सिद्धांत:

  1. Foo.GetType()एक Typeवस्तु देता है जिसमें चर के लिए प्रकार होता है Foo। दूसरे शब्दों में, यह आपको बताता है कि किसका Fooउदाहरण है।
  2. GetType(Bar)एक Typeऑब्जेक्ट देता है जिसमें टाइपनाम के लिए प्रकार होता है Bar
  3. कुछ उदाहरणों में, एक वस्तु जिस प्रकार की होती है, वह Castउस प्रकार से अलग होती है, जिस वस्तु से पहली बार तात्कालिकता की गई थी। निम्नलिखित उदाहरण में, MyObj एक Integerकास्ट में है Object:

    Dim MyVal As Integer = 42 Dim MyObj As Object = CType(MyVal, Object)

तो, MyObjप्रकार का है Objectया प्रकार का है Integer? MyObj.GetType()आपको बताएगा यह एक है Integer

  1. लेकिन यहां वह Type Of Foo Is Barसुविधा है, जो आपको एक चर Fooका पता लगाने के लिए टाइपनाम के साथ संगत है BarType Of MyObj Is Integerऔर Type Of MyObj Is Objectक्या दोनों सच लौटाएंगे। अधिकांश मामलों के लिए, टाइपऑफ इंगित करेगा कि एक वैरिएबल टाइपनाम के साथ संगत है यदि वैरिएबल उस प्रकार का है या उस प्रकार का है जो इसके साथ आता है। यहाँ अधिक जानकारी: https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/typeof-operator#remarks

नीचे दिए गए परीक्षण में वर्णित कीवर्ड और गुणों में से प्रत्येक के व्यवहार और उपयोग को अच्छी तरह से चित्रित किया गया है।

Public Sub TestMethod1()

    Dim MyValInt As Integer = 42
    Dim MyValDble As Double = CType(MyValInt, Double)
    Dim MyObj As Object = CType(MyValDble, Object)

    Debug.Print(MyValInt.GetType.ToString) 'Returns System.Int32
    Debug.Print(MyValDble.GetType.ToString) 'Returns System.Double
    Debug.Print(MyObj.GetType.ToString) 'Returns System.Double

    Debug.Print(MyValInt.GetType.GetType.ToString) 'Returns System.RuntimeType
    Debug.Print(MyValDble.GetType.GetType.ToString) 'Returns System.RuntimeType
    Debug.Print(MyObj.GetType.GetType.ToString) 'Returns System.RuntimeType

    Debug.Print(GetType(Integer).GetType.ToString) 'Returns System.RuntimeType
    Debug.Print(GetType(Double).GetType.ToString) 'Returns System.RuntimeType
    Debug.Print(GetType(Object).GetType.ToString) 'Returns System.RuntimeType

    Debug.Print(MyValInt.GetType = GetType(Integer)) '# Returns True
    Debug.Print(MyValInt.GetType = GetType(Double)) 'Returns False
    Debug.Print(MyValInt.GetType = GetType(Object)) 'Returns False

    Debug.Print(MyValDble.GetType = GetType(Integer)) 'Returns False
    Debug.Print(MyValDble.GetType = GetType(Double)) '# Returns True
    Debug.Print(MyValDble.GetType = GetType(Object)) 'Returns False

    Debug.Print(MyObj.GetType = GetType(Integer)) 'Returns False
    Debug.Print(MyObj.GetType = GetType(Double)) '# Returns True
    Debug.Print(MyObj.GetType = GetType(Object)) 'Returns False

    Debug.Print(TypeOf MyObj Is Integer) 'Returns False
    Debug.Print(TypeOf MyObj Is Double) '# Returns True
    Debug.Print(TypeOf MyObj Is Object) '# Returns True


End Sub

संपादित करें

आप Information.TypeName(Object)किसी दिए गए ऑब्जेक्ट का TypeName प्राप्त करने के लिए भी उपयोग कर सकते हैं । उदाहरण के लिए,

Dim Foo as Bar
Dim Result as String
Result = TypeName(Foo)
Debug.Print(Result) 'Will display "Bar"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.