Nasıl yapılır: Anonim Türde Bildirimlerden Özellik Adları ve Türlerini Çıkarma (Visual Basic)

Anonim türler, özelliklerin veri türlerini doğrudan belirtmek için herhangi bir mekanizma sağlamaz. Tüm özelliklerin türleri çıkarılır. Aşağıdaki örnekte ve Price türleriName, bunları başlatmak için kullanılan değerlerden doğrudan çıkarılır.

' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}

Anonim türler, diğer kaynaklardan özellik adlarını ve türlerini de çıkarabilir. Aşağıdaki bölümlerde çıkarım mümkün olan koşulların listesi ve olmadığı durum örnekleri sağlanır.

Başarılı Çıkarım

Anonim türler, aşağıdaki kaynaklardan özellik adlarını ve türlerini çıkarabilir:

  • Değişken adlarından. Anonim türün anonProduct ve productPriceolmak üzere iki özelliği productName olacaktır. Veri türleri sırasıyla özgün değişkenlerin String ve Doubleolacaktır.

    Dim productName As String = "paperclips"
    Dim productPrice As Double = 1.29
    Dim anonProduct = New With {Key productName, Key productPrice}
    
    ' To create uppercase variable names for the new properties,
    ' assign variables productName and productPrice to uppercase identifiers.
    Dim anonProduct1 = New With {Key .Name = productName, Key .Price = productPrice}
    
  • Diğer nesnelerin özellik veya alan adlarından. Örneğin, ve ID özelliklerini içeren Name bir CarClass tür nesnesi düşününcar. nesnesindeki car değerlerle başlatılan ile ve ID özellikleriyle Name yeni bir anonim tür örneği car1oluşturmak için aşağıdakileri yazabilirsiniz:

    Dim car1 = New With {Key car.Name, Key car.ID}
    

    Önceki bildirim, anonim türü car2tanımlayan daha uzun kod satırına eşdeğerdir.

    Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
    
  • XML üye adlarından.

    Dim books = <Books>
                    <Book Author="Jesper Aaberg">
                        Advanced Programming Methods
                    </Book>
                </Books>
    Dim anon = New With {books...<Book>}
    

    için anon sonuçta elde edilen türün BookIEnumerabletüründe bir özelliği (Of XElement) olacaktır.

  • Aşağıdaki örnekte olduğu gibi SomeFunction parametresi olmayan bir işlevden.

    Dim sc As New SomeClass
    Dim anon1 = New With {Key sc.SomeFunction()}
    

    Aşağıdaki koddaki değişken anon2 , adlı Firstbir karakter olan tek özelliği olan anonim bir türdür. Bu kod, işlevi Firsttarafından döndürülen "E" harfini görüntüler.

    Dim aString As String = "Example String"
    Dim anon2 = New With {Key aString.First()}
    ' The variable anon2 has one property, First.
    Console.WriteLine(anon2.First)
    

Çıkarım Hataları

Ad çıkarımı aşağıdakiler de dahil olmak üzere birçok durumda başarısız olur:

  • Çıkarım, bağımsız değişken gerektiren bir yöntemin, oluşturucunun veya parametreli özelliğin çağrılmasından türetilir. Bir veya daha fazla bağımsız değişken varsa someFunction önceki bildirimi anon1 başarısız olur.

    ' Not valid.
    ' Dim anon3 = New With {Key sc.someFunction(someArg)}
    

    Yeni bir özellik adına atama sorunu çözer.

    ' Valid.
    Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
    
  • Çıkarım, karmaşık bir ifadeden türetilir.

    Dim aString As String = "Act "
    ' Not valid.
    ' Dim label = New With {Key aString & "IV"}
    

    Hata, ifadenin sonucu bir özellik adına atanarak çözülebilir.

    ' Valid.
    Dim label1 = New With {Key .someLabel = aString & "IV"}
    
  • Birden çok özellik için çıkarım, aynı ada sahip iki veya daha fazla özellik üretir. Önceki örneklerde yer alan bildirimlere geri dönerek, hem hem de product.Namecar1.Name özelliklerini aynı anonim türün özellikleri olarak listeleyemezsiniz. Bunun nedeni, bunların her biri için çıkarılacak tanımlayıcının olmasıdır Name.

    ' Not valid.
    ' Dim anon5 = New With {Key product.Name, Key car1.Name}
    

    Bu sorun, değerlerin ayrı özellik adlarına atanarak çözülebilir.

    ' Valid.
    Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
    

    Büyük/küçük harflerdeki değişikliklerin (büyük ve küçük harfler arasındaki değişiklikler) iki adı ayrı yapmadığını unutmayın.

    Dim price = 0
    ' Not valid, because Price and price are the same name.
    ' Dim anon7 = New With {Key product.Price, Key price}
    
  • Bir özelliğin başlangıç türü ve değeri henüz oluşturulmamış başka bir özelliğe bağlıdır. Örneğin, .IDName = .LastName önceden başlatılmadığı sürece .LastName anonim tür bildiriminde geçerli değildir.

    ' Not valid.
    ' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}
    

    Bu örnekte, özelliklerin bildirildiği sırayı tersine çevirme yoluyla sorunu çözebilirsiniz.

    ' Valid.
    Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
    
  • Anonim türün özellik adı, üyesinin adıyla Objectaynıdır. Örneğin, aşağıdaki bildirim bir yöntemi Objectolduğundan Equals başarısız olur.

    ' Not valid.
    ' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _
    '                       "greater than", Key .Less = "less than"}
    

    Özellik adını değiştirerek sorunu çözebilirsiniz:

    ' Valid 
    Dim relationsLabels2 = New With {Key .EqualString = "equals",
                                     Key .GreaterString = "greater than",
                                     Key .LessString = "less than"}
    

Ayrıca bkz.