VB.NET uso con parola chiave su un oggetto esistente?
-
22-09-2019 - |
Domanda
E 'in qualche modo possibile di utilizzare il 'Con' parola chiave su un oggetto esistente?
Vorrei fare quanto segue utilizzando LINQ to Objects e non riesco a trovare un modo:
From m as Product in Me _
Select m With {.Match = m.Name.IndexOf(query)} _
Where m.Name.IndexOf(query) > 0
Soluzione
Non v'è alcun modo di fare questo (With
può essere utilizzato solo con un costruttore). Violerebbe i principi di funzionamento su cui si fonda LINQ, in particolare che non ci saranno effetti collaterali.
La cosa migliore è quello di creare un nuovo prodotto nel selezionare con il set di proprietà Match.
From m as Product in Me _
Where m.Name.IndexOf(query) > 0 _
Select New Product() With _
{ _
.Match = m.Name.IndexOf(query), _
...apply the rest of m's properties _
}
Altri suggerimenti
In VB.Net ci sono due usi della parola chiave With
.
Il primo è inizializzazione dell'oggetto. È un mezzo per l'assegnazione delle proprietà o campi di un oggetto nella stessa linea come espressione di inizializzazione, senza la necessità di un costruttore specifico per ogni permutazione dei campi.
Dim x = New Product With {.Name = "Foo"}
Questo tipo di espressione può essere utilizzato solo per creare nuovi oggetti. Non può essere utilizzato per modificare quelli esistenti.
Il secondo uso è la dichiarazione With
. Questo permette di inserire un oggetto in un contesto così dire e chiamare molti. operazioni su di esso senza qualifica.
With x
Console.WriteLine(.Name)
.Match = 42
End With
Nessuno di questi però vi permetterà di utilizzare un oggetto esistente come modello per la creazione di un nuovo oggetto.
No. Il problema è che la parola chiave With
(la parola oggetto di inizializzazione, non la dichiarazione) può essere utilizzato solo dopo aver creato un nuovo oggetto.
Il team VB pensa che gli effetti collaterali dell'utilizzo di With
su un oggetto esistente sarebbe troppo confuso.
A proposito il problema: se Match
non è ancora una proprietà del Product
, la soluzione più pulita potrebbe essere per incapsulare l'output richiesto in un nuovo oggetto:
From m as Product in Me _
Select New With {.Match = m.Name.IndexOf(query), .Product = m} _
Where m.Name.IndexOf(query) > 0
Con un metodo di estensione su System.Object
che accetta un lambda, è possibile simulare abbastanza da vicino tale caratteristica. C'è un esempio in questa risposta , ma è in C #. Probabilmente non è troppo difficile da tradurre in VB.NET.