¿Cómo puedo pasar tipos anónimos como parámetros a otras funciones? Considere este ejemplo:
var query = from employee in employees select new { Name = employee.Name, Id = employee.Id };
LogEmployees(query);
La variable query
aquí no tiene un tipo fuerte. ¿Cómo debo definir mi LogEmployees
función para aceptarla?
public void LogEmployees (? list)
{
foreach (? item in list)
{
}
}
En otras palabras, ¿qué debo usar en lugar de ?
marcas?
c#
function
parameters
anonymous-types
Saeed Neamati
fuente
fuente
Respuestas:
Creo que deberías hacer una clase para este tipo anónimo. Eso sería lo más sensato que hacer en mi opinión. Pero si realmente no quieres, puedes usar la dinámica:
Tenga en cuenta que esto no está fuertemente tipeado, por lo que si, por ejemplo, Nombre cambia a EmployeeName, no sabrá que hay un problema hasta el tiempo de ejecución.
fuente
dynamic
uso. Realmente me fue útil. Gracias :)Puedes hacerlo así:
... pero no podrás hacer mucho con cada artículo. Puede llamar a ToString, pero no podrá usar (por ejemplo)
Name
yId
directamente.fuente
where T : some type
al final de la primera línea para reducir el tipo. En ese punto, sin embargo, esperar un cierto tipo de interfaz común tendría más sentido esperar una interfaz. :)where T : some type
embargo, no se puede usar con tipos anónimos, ya que no implementan ningún tipo de interfaz ...Desafortunadamente, lo que estás tratando de hacer es imposible. Bajo el capó, la variable de consulta se escribe para ser
IEnumerable
de tipo anónimo. Los nombres de tipos anónimos no se pueden representar en el código de usuario, por lo tanto, no hay forma de convertirlos en un parámetro de entrada para una función.Su mejor opción es crear un tipo y usarlo como el retorno de la consulta y luego pasarlo a la función. Por ejemplo,
Sin embargo, en este caso, solo está seleccionando un solo campo, por lo que puede ser más fácil seleccionar el campo directamente. Esto hará que la consulta se escriba como
IEnumerable
del tipo de campo. En este caso, nombre de columna.fuente
Equals
cambia el comportamiento. Es decir, tienes que implementarlo. (Conocía esta discrepancia, pero aún así me olvidé de ella durante una refactorización).No puede pasar un tipo anónimo a una función no genérica, a menos que el tipo de parámetro sea
object
.Los tipos anónimos están destinados al uso a corto plazo dentro de un método.
De MSDN - Tipos anónimos :
(énfasis mío)
Actualizar
Puedes usar genéricos para lograr lo que quieres:
fuente
object
- ordynamic
; pobject
no es lo mismo que hacer un método genérico en el tipo anónimo, según mi respuesta.Normalmente, haces esto con genéricos, por ejemplo:
El compilador debe inferir
T
cuándo llamaMapEntToObj(query)
. No estoy muy seguro de lo que quiere hacer dentro del método, por lo que no puedo decir si esto es útil ... el problema es que dentro deMapEntToObj
usted todavía no puede nombrar elT
- usted puede:T
T
para hacer cosaspero aparte de eso, es bastante difícil manipular tipos anónimos, sobre todo porque son inmutables ;-p
Otro truco (al extraer datos) es también pasar un selector, es decir, algo como:
fuente
Puedes usar genéricos con el siguiente truco (conversión a tipo anónimo):
fuente
"dinámico" también se puede utilizar para este propósito.
fuente
En lugar de pasar un tipo anónimo, pase una Lista de un tipo dinámico:
var dynamicResult = anonymousQueryResult.ToList<dynamic>();
DoSomething(List<dynamic> _dynamicResult)
DoSomething(dynamicResult);
Gracias a Petar Ivanov !
fuente
Si sabe que sus resultados implementan una determinada interfaz, puede usar la interfaz como tipo de datos:
fuente
Lo usaría
IEnumerable<object>
como tipo para el argumento. Sin embargo, no es una gran ganancia para el elenco explícito inevitable. Saludfuente