Tengo una consulta que devuelve un tipo anónimo y la consulta está en un método. ¿Cómo escribes esto?
public "TheAnonymousType" TheMethod(SomeParameter)
{
using (MyDC TheDC = new MyDC())
{
var TheQueryFromDB = (....
select new { SomeVariable = ....,
AnotherVariable = ....}
).ToList();
return "TheAnonymousType";
}
}
c#
.net
anonymous-types
return-type
Frenchie
fuente
fuente
Respuestas:
No puedes.
Sólo puede volver
object
, o contenedor de objetos, por ejemploIEnumerable<object>
,IList<object>
, etc.fuente
dynamic
. Eso hace que sea un poco más fácil trabajar con él.Puede regresar, lo
dynamic
que le dará una versión verificada en tiempo de ejecución del tipo anónimo, pero solo en .NET 4+fuente
En C # 7 podemos usar tuplas para lograr esto:
System.ValueTuple
Sin embargo, es posible que deba instalar el paquete nuget.fuente
No puede devolver tipos anónimos. ¿Puedes crear un modelo que se pueda devolver? De lo contrario, debe utilizar un
object
.Aquí hay un artículo escrito por Jon Skeet sobre el tema.
Código del artículo:
O aquí hay otro artículo similar
O, como otros comentan, puede usar
dynamic
fuente
Puede usar la clase Tuple como sustituto de tipos anónimos cuando sea necesario regresar:
Nota: Tuple puede tener hasta 8 parámetros.
O, para el ejemplo de la publicación original:
http://msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx
fuente
El compilador de C # es un compilador de dos fases. En la primera fase, solo verifica los espacios de nombres, jerarquías de clases, firmas de métodos, etc. Los cuerpos de los métodos se compilan solo durante la segunda fase.
Los tipos anónimos no se determinan hasta que se compila el cuerpo del método.
Por lo tanto, el compilador no tiene forma de determinar el tipo de retorno del método durante la primera fase.
Esa es la razón por la que los tipos anónimos no se pueden utilizar como tipo de retorno.
Como han sugerido otros, si está usando .net 4.0 o rallador, puede usar
Dynamic
.Si yo fuera usted, probablemente crearía un tipo y devolvería ese tipo del método. De esa manera es fácil para los futuros programadores que mantienen su código y más legible.
fuente
Tres opciones:
Opción 1:
Opcion 2:
puedes iterarlo como objeto
Opcion 3:
y podrás iterarlo como un objeto dinámico y acceder a sus propiedades directamente
fuente
Puede devolver la lista de objetos en este caso.
fuente
Usando C # 7.0 todavía no podemos devolver tipos anónimos pero tenemos soporte para tipos de tupla y, por lo tanto, podemos devolver una colección de
tuple
(System.ValueTuple<T1,T2>
en este caso). ActualmenteTuple types
no se admiten en árboles de expresión y necesita cargar datos en la memoria.La versión más corta del código que desea puede verse así:
O usando la sintaxis fluida de Linq:
Usando C # 7.1 podemos omitir los nombres de las propiedades de la tupla y se deducirán de la inicialización de la tupla como funciona con tipos anónimos:
fuente
Crear su propia clase y consultarla es la mejor solución que conozco. Por lo que sé, no puede usar valores de retorno de tipo anónimo en otro método, porque no solo será reconocido. Sin embargo, se pueden usar en el mismo. método. Solía devolverlos como
IQueryable
oIEnumerable
, aunque todavía no te permite ver qué hay dentro de la variable de tipo anónimo.Me encontré con algo como esto antes mientras intentaba refactorizar un código, puede verificarlo aquí: Refactorización y creación de métodos separados
fuente
Con reflexión.
Muestra:
Salida:
fuente
Solo puede utilizar palabras clave dinámicas,
Pero con la palabra clave de tipo dinámico perderá seguridad en el tiempo de compilación, IDE IntelliSense, etc.
fuente
Otra opción podría ser el uso de automapper: convertirá a cualquier tipo de su objeto devuelto anónimo a medida que las propiedades públicas largas coincidan. Los puntos clave son, devolver el objeto, usar linq y autommaper. (o use una idea similar que devuelva json serializado, etc. o use la reflexión ..)
fuente
Ahora con funciones locales especialmente, pero siempre puede hacerlo pasando un delegado que haga el tipo anónimo.
Entonces, si su objetivo era ejecutar una lógica diferente en las mismas fuentes y poder combinar los resultados en una sola lista. No estoy seguro de qué matiz falta para cumplir con el objetivo establecido, pero siempre que devuelva un
T
y pase un delegado para hacerT
, puede devolver un tipo anónimo de una función.fuente
De hecho, es posible devolver un tipo anónimo de un método en un caso de uso particular. ¡Echemos un vistazo!
Con C # 7 es posible devolver tipos anónimos de un método, aunque viene con una ligera restricción. Vamos a utilizar una nueva característica del lenguaje llamada función local junto con un truco de indirección (otra capa de indirección puede resolver cualquier desafío de programación, ¿verdad?).
Aquí hay un caso de uso que identifiqué recientemente. Quiero registrar todos los valores de configuración después de haberlos cargado
AppSettings
. ¿Por qué? Porque hay cierta lógica en torno a los valores perdidos que vuelven a los valores predeterminados, algunos análisis, etc. Una forma fácil de registrar los valores después de aplicar la lógica es ponerlos todos en una clase y serializarlos en un archivo de registro (usando log4net). También quiero encapsular la lógica compleja de lidiar con las configuraciones y separar eso de lo que tenga que hacer con ellas. ¡Todo sin crear una clase con nombre que exista para un solo uso!Veamos cómo resolver esto usando una función local que crea un tipo anónimo.
He logrado construir una clase anónima y también encapsular la lógica de lidiar con la gestión de entornos complejos, todo dentro
CreateHttpClient
y dentro de su propia "expresión". Puede que esto no sea exactamente lo que quería el OP, pero es un enfoque ligero con tipos anónimos que actualmente es posible en C # moderno.fuente