Pregunta

¿Es de algún modo posible utilizar el 'con' palabra clave en un objeto existente?

Me gustaría hacer lo siguiente usando LINQ a objetos y parece que no puede encontrar una manera:

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

Solución

No hay ninguna manera de hacer esto (With sólo se puede utilizar con un constructor). Se violaría los principios de funcionamiento en que se basa LINQ, específicamente que no habrá efectos secundarios.

La mejor opción es crear un nuevo producto en su selecto con el conjunto de propiedades de ajuste.

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

Otros consejos

En VB.Net hay dos usos de la palabra clave With.

El primero es objeto de inicialización. Es un medio de asignación de propiedades o campos de un objeto en la misma línea como una expresión de inicialización sin la necesidad de un constructor específico para cada permutación de los campos.

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

Este tipo de expresión sólo puede ser usado para crear nuevos objetos. No se puede utilizar para modificar los existentes.

El segundo uso es la declaración With. Esto le permite poner un objeto en el contexto así decirlo, y llama a muchos. operaciones en él sin cualificación.

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

Ninguna de estas cosas, aunque se permitirá utilizar un objeto existente como plantilla para crear un nuevo objeto.

No. El problema es que la palabra clave With (la palabra clave objeto de inicialización, no la declaración) sólo se puede utilizar después de crear un nuevo objeto.

El equipo de VB piensa que los efectos secundarios del uso de With en un objeto existente serían demasiado confuso.

Sobre el problema: Si Match todavía no es una propiedad de Product, la solución más limpia podría ser para encapsular la salida requerida en un nuevo objeto:

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

Con un método de extensión en System.Object que acepta un lambda, se puede simular una característica muy de cerca. Hay un ejemplo en esta respuesta , pero es en C #. No es probable que sea demasiado difícil de traducir a VB.NET.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top