কোনও বস্তু নির্দিষ্ট ধরণের কিনা তা কীভাবে পরীক্ষা করবেন


102

একই প্রক্রিয়াটি চালানোর জন্য আমি সাব্রোটিনের কাছে বিভিন্ন বস্তুগুলি পার করছি তবে প্রতিবারই একটি ভিন্ন অবজেক্ট ব্যবহার করছি। উদাহরণস্বরূপ, একটি ক্ষেত্রে আমি একটি তালিকাভিউ ব্যবহার করছি এবং অন্য ক্ষেত্রে আমি একটি ড্রপডাউনলিস্টটি পাস করছি।

আমি যাচাই করা অবজেক্টটি ড্রপডাউনলিস্ট কিনা তা পরীক্ষা করতে চাই তবে কিছু কোড থাকলে তা কার্যকর করুন ute আমি এটা কিভাবে করবো?

আমার কোড এখন পর্যন্ত যা কাজ করে না:

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

উত্তর:


161

ভিবি.এনইটি-তে, আপনাকে কোনও অবজেক্টের উদাহরণের ধরণের পুনরুদ্ধার করার জন্য 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

সম্পূর্ণরূপে তুচ্ছ, অপ্রাসঙ্গিক নীটপিক: ditionতিহ্যগতভাবে , NET কোড লেখার সময় পরামিতিগুলির নামগুলি উট কেসড (যার অর্থ তারা সর্বদা একটি নিম্ন-অক্ষরের অক্ষর দিয়ে শুরু করেন)। এটি ক্লাস, প্রকার, পদ্ধতি ইত্যাদি থেকে এক নজরে আলাদা করতে তাদের সহজ করে তোলে


4
আপনার উত্তরের জন্য ধন্যবাদ. আমি সেই কোডটি চেষ্টা করেছিলাম তবে প্রকৃতপক্ষে কেবলমাত্র এটি '=' অপারেটরের সাথে কাজ করে না। আমাকে এটি 'ইস'-তে পরিবর্তন করতে হয়েছিল। 'অপারেটর' = 'থাকাকালীন আমার যে ত্রুটি হয়েছিল সেটিকে' সিস্টেম.টাইপ 'এবং' সিস্টেম.টাইপ 'ধরণের জন্য সংজ্ঞায়িত করা হয় না। "
লেয়া

4
@ ল্যাঃ হ্যাঁ, সে সম্পর্কে দুঃখিত। দেখে মনে হচ্ছে উত্তর লেখার সময় আমার আরও মনোযোগ দেওয়া শুরু করা উচিত। TypeOfকমপক্ষে কোড পাঠযোগ্যতার দিক থেকে সম্ভবত এটি একটি আরও সহজ বিকল্প; আমি এর একটি উদাহরণ সহ উত্তরও আপডেট করেছি।
কোডি গ্রে

35
দুজনের মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে, যা আমাকে এই পোস্টে নিয়ে গেছে। টাইপফেক চেকটি সত্যটি ফিরে আসবে যদি বস্তুটি এমন কোনও শ্রেণীর হয় যা আপনি যে ধরণের বিরুদ্ধে পরীক্ষা করছেন তা উত্তরাধিকার সূত্রে প্রাপ্ত হয়, অন্যদিকে গেটটাইপ কেবল একই সত্য হয় যদি এটি একই শ্রেণীর হয়।
অ্যাবাকাস

সম্পূর্ণরূপে তুচ্ছ, অপ্রাসঙ্গিক কাউন্টারপয়েন্ট: যদিও ভিএস কোডএনালাইসিস অভিযোগ করে, তবুও আমি অনুভব করি যে আর্গুমেন্টের নামগুলি পাবলিক ইন্টারফেসের অংশ এবং তাই আমার কোডে পাস্কেলকেস are
মার্ক হুরড

দুজনের মধ্যে পারফরম্যান্সের পার্থক্য রয়েছে কি? - Select Case (Obj.GetType())একাধিক পরীক্ষার ক্ষেত্রে একাধিক পরীক্ষার কী হবে IF TypeOf Obj is ...?
লুক টি ওব্রায়েন

3

কোডি গ্রে থেকে দেওয়া প্রতিক্রিয়ার সাথে সম্পর্কিত আরও কিছু বিশদ। যেহেতু এটি হজম করতে আমার কিছুটা সময় লেগেছিল যদিও আমি এটি অন্যদের পক্ষে উপকারী হতে পারি।

প্রথমত, কিছু সংজ্ঞা:

  1. টাইপনাম রয়েছে, যা কোনও অবজেক্ট, ইন্টারফেস ইত্যাদির স্ট্রিং প্রতিনিধিত্ব করে উদাহরণস্বরূপ, Barটাইপনাম ইন Public Class Barবা ইন 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-references/operators/typeof-operator#remark

নীচের পরীক্ষাটি উল্লিখিত কীওয়ার্ড এবং বৈশিষ্ট্যের প্রত্যেকটির আচরণ এবং ব্যবহারকে বেশ ভালভাবে চিত্রিত করে।

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)প্রদত্ত কোনও অবজেক্টের টাইপনেম পেতেও ব্যবহার করতে পারেন। উদাহরণ স্বরূপ,

Dim Foo as Bar
Dim Result as String
Result = TypeName(Foo)
Debug.Print(Result) 'Will display "Bar"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.