2010-03-24 2 views
2

Возможно ли использовать ключевое слово «С» на существующем объекте?VB.NET Использование С ключевым словом на существующий объект?

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

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

ответ

1

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

Лучше всего создать новый продукт в выбранном вами наборе свойств соответствия.

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

Это то, что мне нужно для достижения! Большое спасибо – Ropstah

1

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

The VB team thinks, что побочные эффекты использования 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

Вы прочитали этот пост? Мне кажется, что они категорически отвергают эту идею. –

+0

@ Даниэль: Спасибо, моя память обманула меня. Я исправил свой ответ. – Heinzi

0

С методом расширения на System.Object, который принимает лямбда, вы можете моделировать такую ​​особенность довольно близко. There's an example in this answer, но он находится на C#. Это, вероятно, не слишком сложно перевести на VB.NET.

2

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

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

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

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

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

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

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

+0

+1 за последнее предложение :) – Ropstah

Смежные вопросы