Bir nesnenin belirli bir tür olup olmadığı nasıl kontrol edilir


102

Aynı işlemi çalıştırmak için ancak her seferinde farklı bir nesne kullanmak için çeşitli nesneleri bir alt yordama geçiriyorum. Örneğin, bir durumda bir ListView kullanıyorum ve başka bir durumda bir DropDownList geçiriyorum.

İletilen nesnenin bir DropDownList olup olmadığını kontrol etmek istiyorum, ardından eğer öyleyse bazı kodlar yürütün. Bunu nasıl yaparım?

Şu ana kadar çalışmayan kodum:

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

Yanıtlar:


160

VB.NET'te, bir nesnenin bir örneğinin türünü almak için GetTypeyöntemi ve bilinen başka bir türün türünü almak için GetType()operatörü kullanmanız gerekir.

İki türe sahip olduğunuzda, Isoperatörü kullanarak bunları kolayca karşılaştırabilirsiniz .

Yani kodunuz aslında şu şekilde yazılmalıdır:

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

Yöntem yerine TypeOfoperatörü de kullanabilirsiniz GetType. Bunun, nesnenizin aynı tür olup olmadığını değil, nesnenizin verilen türle uyumlu olup olmadığını test ettiğini unutmayın . Bu şuna benzer:

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

End If

Tamamen önemsiz, ilgisiz nitpick: Geleneksel olarak, .NET kodu (VB.NET veya C #) yazarken parametrelerin adları camelCased'dır (yani her zaman küçük harfle başlarlar). Bu onların sınıflardan, türlerden, yöntemlerden vb. Bir bakışta ayırt edilmesini kolaylaştırır.


1
Cevabınız için teşekkürler. Bu kodu denedim ama aslında tek şey '=' operatörü ile çalışmaması. Bunu 'Eşittir' olarak değiştirmem gerekti. "=" İken yaşadığım hata "Operator '=", "System.Type" ve "System.Type" türleri için tanımlanmadı. "
Leah

1
@Leah: Evet, bunun için üzgünüm. Görünüşe göre cevapları yazarken daha fazla dikkat etmeliyim TypeOfmuhtemelen daha da basit bir seçenektir, en azından kod okunabilirliği açısından; Cevabı bunun bir örneğiyle de güncelledim.
Cody Grey

35
İkisi arasında önemli bir fark var, bu da beni bu yazıya yönlendirdi. TypeOf denetimi, nesne kontrol ettiğiniz türden miras alan bir sınıfsa True döndürürken GetType yalnızca tam olarak aynı sınıfsa True döndürür.
Abacus

Tamamen önemsiz, ilgisiz kontrpuan: VS CodeAnalysis şikayetçi olsa da, argüman adlarının genel arayüzün bir parçası olduğunu ve benim kodumdaki PascalCase'in de olduğunu hissediyorum.
Mark Hurd

İkisi arasında performans farkı var mı? - Select Case (Obj.GetType())Birden çok test senaryosu Vs çoklu ile ne olacak IF TypeOf Obj is ...?
Luke T O'Brien

3

Cody Gray'den gelen yanıtla ilgili biraz daha ayrıntı. Sindirmem biraz zaman aldığından, başkaları için yararlı olabileceğini düşündüm.

İlk olarak, bazı tanımlar:

  1. Bir nesnenin, arabirimin, vb. Türünün dize temsilleri olan TypeNames vardır. Örneğin, BarTypeName in Public Class Barveya in Dim Foo as Bar. TypeNames, derleyiciye mevcut tüm türlerin açıklanacağı bir sözlükte hangi tür tanımının aranacağını söylemek için kodda kullanılan "etiketler" olarak görülebilir.
  2. Var System.Typebir değer içeren nesneler. Bu değer bir türü belirtir; tıpkı a'nın bir Stringmetni alması veya bir Intsayı alması gibi, ancak metin veya sayı yerine türleri saklıyoruz. Typenesneler, tür tanımlarını ve buna karşılık gelen TypeName'i içerir.

İkincisi, teori:

  1. Foo.GetType()Typedeğişkenin türünü içeren bir nesne döndürür Foo. Başka bir deyişle, neyin Foobir örneğini size söyler .
  2. GetType(Bar)TypeTypeName için türü içeren bir nesne döndürür Bar.
  3. Bazı durumlarda, bir nesnenin bulunduğu Casttür, bir nesnenin ilk örneğinin oluşturulduğu türden farklıdır. Aşağıdaki örnekte, MyObj Integerbir Object:

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

Yani bu MyObjtip bir Objectveya türdeki Integer? MyObj.GetType()bunun bir olduğunu söyleyeceğim Integer.

  1. Ancak burada Type Of Foo Is Bar, bir değişkenin Foobir TypeName ile uyumlu olduğunu belirlemenizi sağlayan özellik geliyor Bar. Type Of MyObj Is Integerve Type Of MyObj Is Objecther ikisi de True döndürür. Çoğu durumda, TypeOf, değişkenin o Type veya ondan türetilen bir Type olması durumunda bir değişkenin TypeName ile uyumlu olduğunu gösterir. Daha fazla bilgi burada: https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/typeof-operator#remarks

Aşağıdaki test, bahsedilen anahtar kelimelerin ve özelliklerin her birinin davranışını ve kullanımını oldukça iyi göstermektedir.

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

DÜZENLE

Information.TypeName(Object)Belirli bir nesnenin TypeName değerini almak için de kullanabilirsiniz . Örneğin,

Dim Foo as Bar
Dim Result as String
Result = TypeName(Foo)
Debug.Print(Result) 'Will display "Bar"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.