VB.NET Использовать с ключевым словом для существующего объекта? - PullRequest
2 голосов
/ 25 марта 2010

Возможно ли как-то использовать ключевое слово "With" для существующего объекта?

Я хотел бы сделать следующее, используя LINQ для объектов, и, похоже, не могу найти способ:

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

Ответы [ 4 ]

2 голосов
/ 25 марта 2010

В VB.Net есть два использования ключевого слова With.

Первый - инициализация объекта. Это средство присвоения свойств или полей объекта в той же строке, что и выражение инициализации, без необходимости конкретного конструктора для каждой перестановки полей.

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

Этот тип выражения может использоваться только для создания новых объектов. Его нельзя использовать для изменения существующих.

Второе использование - оператор With. Это позволяет вам поместить объект в контекст, так сказать, и вызвать многих. Операции на нем без квалификации.

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

Ни один из них, тем не менее, не позволит вам использовать существующий объект в качестве шаблона для создания нового объекта.

1 голос
/ 25 марта 2010

Нет, сделать это невозможно (With можно использовать только с конструктором). Это нарушит функциональные принципы, на которых построен linq, в частности, что не будет побочных эффектов.

Лучше всего создать новый продукт по вашему выбору с набором свойств 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 _
              } 
1 голос
/ 25 марта 2010

Нет. Проблема в том, что ключевое слово With (ключевое слово инициализации объекта, а не оператор) можно использовать только после создания нового объекта.

Команда VB считает , что побочные эффекты использования With на существующем объекте будут слишком запутанными.

О вашей проблеме: если Match еще не является свойством Product, самое чистое решение может заключаться в инкапсуляции требуемого вывода в новый объект:

From m as Product in Me _
  Select New With {.Match = m.Name.IndexOf(query), .Product = m} _ 
  Where m.Name.IndexOf(query) > 0
0 голосов
/ 25 марта 2010

С помощью метода расширения на System.Object, который принимает лямбду, вы можете довольно точно смоделировать такую ​​функцию. В этом ответе есть пример , но он написан на C #.Это, вероятно, не так уж сложно перевести на VB.NET.

...