如何:在匿名類型宣告中推斷屬性名稱和類型 (Visual Basic)
匿名類型未提供任何機制來直接指定屬性的資料類型。 所有屬性的類型都是推斷而來。 在下列範例中,透過用來初始化 Name
和 Price
類型的值,直接推斷這些類型。
' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}
匿名類型也可以推斷其他來源的屬性名稱和類型。 以下章節提供可進行推斷的情況清單,以及不可進行推斷的狀況範例。
成功推斷
匿名類型可以推斷下列來源的屬性名稱和類型:
透過變數名稱。 匿名類型
anonProduct
會有兩個屬性:productName
和productPrice
。 其資料類型分別是下列原始變數:String
和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}
透過其他物件的屬性或欄位名稱。 例如,考慮使用類型為
car
且包含CarClass
和Name
屬性的ID
物件。 若要利用使用car1
物件值初始化的Name
和ID
屬性來建立新的匿名類型執行個體 (car
),您可以撰寫下列項目:Dim car1 = New With {Key car.Name, Key car.ID}
先前的宣告等同於定義匿名類型
car2
的較長程式碼行。Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
透過 XML 成員名稱。
Dim books = <Books> <Book Author="Jesper Aaberg"> Advanced Programming Methods </Book> </Books> Dim anon = New With {books...<Book>}
針對
anon
產生的屬性會有一個類型Book
(Of XElement) 的屬性 IEnumerable。透過沒有參數的函式 (如下列範例中的
SomeFunction
)。Dim sc As New SomeClass Dim anon1 = New With {Key sc.SomeFunction()}
下列程式碼中的變數
anon2
是具有一個屬性 (名稱為First
的字元) 的匿名類型。 此程式碼會顯示字母 "E" (即函式 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)
推斷失敗
在許多情況下,名稱推斷都會失敗,包括下列情況:
推斷衍生自叫用方法、建構函式或需要引數的參數化屬性。 如果
anon1
有一個或多個引數,則someFunction
的先前宣告會失敗。' Not valid. ' Dim anon3 = New With {Key sc.someFunction(someArg)}
指派給新的屬性名稱可解決問題。
' Valid. Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
推斷衍生自複雜運算式。
Dim aString As String = "Act " ' Not valid. ' Dim label = New With {Key aString & "IV"}
將運算式的結果指派給屬性名稱,即可解決錯誤。
' Valid. Dim label1 = New With {Key .someLabel = aString & "IV"}
多個屬性的推斷會產生兩個或多個同名的屬性。 推斷回先前範例中的宣告,無法將
product.Name
和car1.Name
列為相同匿名類型的屬性。 原因是所有的推斷識別項都是Name
。' Not valid. ' Dim anon5 = New With {Key product.Name, Key car1.Name}
將值指派給不同的屬性名稱,即可解決問題。
' Valid. Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
請注意,大小寫的變更 (大寫與小寫字母之間的變更) 並不會讓這兩個名稱不同。
Dim price = 0 ' Not valid, because Price and price are the same name. ' Dim anon7 = New With {Key product.Price, Key price}
一個屬性的初始類型和值取決於尚未建立的另一個屬性。 例如,除非已初始化
.IDName = .LastName
,否則.LastName
在匿名類型宣告中無效。' Not valid. ' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}
在此範例中,您可以反轉屬性的宣告順序來修正問題。
' Valid. Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
匿名類型的屬性名稱與 Object成員的名稱相同。 例如,因為
Equals
是 Object的方法,所以下列宣告會失敗。' Not valid. ' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _ ' "greater than", Key .Less = "less than"}
變更屬性名稱,即可修正問題:
' Valid Dim relationsLabels2 = New With {Key .EqualString = "equals", Key .GreaterString = "greater than", Key .LessString = "less than"}