Bagikan melalui


Cara: Menyimpulkan Nama dan Jenis Properti dalam Deklarasi Jenis Anonim (Visual Basic)

Jenis anonim tidak menyediakan mekanisme untuk menentukan jenis data properti secara langsung. Jenis semua properti disimpulkan. Dalam contoh berikut, jenis Name dan Price disimpulkan langsung dari nilai yang digunakan untuk menginisialisasinya.

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

Jenis anonim juga dapat menyimpulkan nama dan jenis properti dari sumber lain. Bagian berikut memberikan daftar keadaan di mana inferensi dimungkinkan, dan contoh situasi di mana hal tersebut tidak dilakukan.

Inferensi Berhasil

Jenis anonim dapat menyimpulkan nama dan jenis properti dari sumber berikut:

  • Dari nama variabel. Jenis anonim anonProduct akan memiliki dua properti, productName dan productPrice. Masing-masing jenis data akan memiliki variabel asli String dan Double.

    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}
    
  • Dari properti atau nama bidang objek lain. Sebagai contoh, pertimbangkan objek car jenis CarClass yang menyertakan properti Name dan ID. Untuk membuat instans jenis anonim baru, properti car1, dengan Name dan ID yang diinsialisasi dengan nilai dari objek car, Anda dapat menulis yang berikut:

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

    Deklarasi sebelumnya setara dengan baris kode yang lebih panjang yang mendefinisikan jenis car2 anonim.

    Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
    
  • Dari nama anggota XML.

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

    Jenis yang dihasilkan untuk anon akan memiliki satu properti, Book, dari jenis IEnumerable(Dari XElement).

  • Dari fungsi yang tidak memiliki parameter, seperti SomeFunction dalam contoh berikut.

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

    Variabel anon2 dalam kode berikut adalah jenis anonim yang memiliki satu properti, karakter bernama First. Kode ini akan menampilkan huruf "E," huruf yang dikembalikan oleh fungsi First.

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

Kegagalan Inferensi

Inferensi nama akan gagal dalam banyak keadaan, termasuk yang berikut ini:

  • Inferensi berasal dari pemanggilan metode, konstruktor, atau properti berparameter yang memerlukan argumen. Deklarasi anon1 sebelumnya gagal jika someFunction memiliki satu atau beberapa argumen.

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

    Penugasan ke nama properti baru memecahkan masalah.

    ' Valid.
    Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
    
  • Inferensi berasal dari ekspresi kompleks.

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

    Kesalahan dapat diatasi dengan menetapkan hasil ekspresi ke nama properti.

    ' Valid.
    Dim label1 = New With {Key .someLabel = aString & "IV"}
    
  • Inferensi untuk beberapa properti menghasilkan dua properti atau lebih yang memiliki nama yang sama. Merujuk kembali ke deklarasi dalam contoh sebelumnya, Anda tidak dapat mencantumkan product.Name dan car1.Name sebagai properti dengan jenis anonim yang sama. Ini karena pengidentifikasi yang disimpulkan untuk masing-masing ini adalah Name.

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

    Masalah dapat diselesaikan dengan menetapkan nilai ke nama properti yang berbeda.

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

    Perhatikan bahwa perubahan kasus (perubahan antara huruf besar dan huruf kecil) tidak membuat dua nama berbeda.

    Dim price = 0
    ' Not valid, because Price and price are the same name.
    ' Dim anon7 = New With {Key product.Price, Key price}
    
  • Jenis awal dan nilai satu properti tergantung pada properti lain yang belum ditetapkan. Misalnya, .IDName = .LastName tidak valid dalam deklarasi jenis anonim kecuali .LastName sudah diinisialisasi.

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

    Dalam contoh ini, Anda dapat memperbaiki masalah dengan mengembalikan urutan di mana properti dideklarasikan.

    ' Valid.
    Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
    
  • Nama properti dari jenis anonim sama dengan nama anggota Object. Misalnya, deklarasi berikut gagal karena Equals merupakan metode dari Object.

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

    Anda dapat memperbaiki masalah dengan mengubah nama properti:

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

Lihat juga