VB.NET在现有对象上使用With关键字?

时间:2010-03-24 22:46:48

标签: vb.net linq-to-objects with-statement

是否可以在现有对象上使用'With'关键字?

我想使用LINQ to对象进行以下操作,似乎无法找到方法:

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

4 个答案:

答案 0 :(得分:2)

在VB.Net中,关键字With有两种用途。

第一个是对象初始化。它是一种在初始化表达式的同一行中分配对象的属性或字段的方法,而不需要为每个字段排列设置特定的构造函数。

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

此类型的表达式只能用于创建新对象。它不能用于修改现有的。

第二种用法是With语句。这允许您将对象置于上下文中以便说出并调用许多对象。没有资格的操作。

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

这些都不允许您使用现有对象作为模板来创建新对象。

答案 1 :(得分: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

答案 2 :(得分: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 _
              } 

答案 3 :(得分:0)

使用System.Object上的扩展方法接受lambda,您可以非常接近地模拟这样的特征。 There's an example in this answer,但它在C#中。翻译成VB.NET可能并不太难。