2010-03-24 5 views
2

Est-il possible d'utiliser le mot-clé 'With' sur un objet existant?VB.NET Utilisation Avec un mot-clé sur un objet existant?

Je voudrais faire ce qui suit à l'aide LINQ aux objets et ne semblent pas trouver un moyen:

From m as Product in Me _ 
    Select m With {.Match = m.Name.IndexOf(query)} _ 
    Where m.Name.IndexOf(query) > 0 

Répondre

1

Non, il n'y a aucun moyen de le faire (With ne peut être utilisé qu'avec un constructeur). Cela viole les principes fonctionnels sur lesquels linq est construit, en particulier qu'il n'y aura pas d'effets secondaires.

La meilleure solution est de créer un nouveau produit dans votre sélection avec l'ensemble de propriétés de correspondance.

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 _ 
       } 
+0

Cela fait exactement ce que je dois accomplir! Merci beaucoup – Ropstah

1

Non. Le problème est que le mot-clé With (le mot-clé d'initialisation d'objet, pas la déclaration) ne peut être utilisé qu'après la création d'un nouvel objet.

The VB team thinks que les effets secondaires de l'utilisation de With sur un objet existant seraient trop confus.

A propos de votre problème: Si Match est pas encore une propriété de Product, la solution la plus propre peut-être pour encapsuler la puissance requise dans un nouvel objet:

From m as Product in Me _ 
    Select New With {.Match = m.Name.IndexOf(query), .Product = m} _ 
    Where m.Name.IndexOf(query) > 0 
+0

L'avez-vous lu? Il me semble qu'ils rejettent fortement l'idée. –

+0

@Daniel: Merci, ma mémoire m'a trompé. J'ai corrigé ma réponse. – Heinzi

0

Avec une méthode d'extension sur System.Object qui accepte un lambda, vous pouvez simuler une telle caractéristique assez près. There's an example in this answer, mais c'est en C#. Ce n'est probablement pas trop difficile à traduire en VB.NET.

2

Dans VB.Net, le mot-clé With peut être utilisé.

La première est l'initialisation d'objet. C'est un moyen d'assigner des propriétés ou des champs d'un objet dans la même ligne qu'une expression d'initialisation sans avoir besoin d'un constructeur spécifique pour chaque permutation de champs.

Dim x = New Product With {.Name = "Foo"} 

Ce type d'expression ne peut être utilisé que pour créer de nouveaux objets. Il ne peut pas être utilisé pour modifier ceux qui existent déjà. La seconde utilisation est l'instruction With. Cela vous permet de mettre un objet en contexte pour ainsi dire et d'en appeler beaucoup. opérations sur elle sans qualification.

With x 
    Console.WriteLine(.Name) 
    .Match = 42 
End With 

Aucun de ces éléments ne vous permettra cependant d'utiliser un objet existant comme modèle pour créer un nouvel objet.

+0

+1 pour la dernière phrase :) – Ropstah

Questions connexes