Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

154
Vistas
¿Es posible extraer una lista de valores de campo particulares de una colección de objetos genéricos en C#?

Tengo el siguiente método en una clase que estoy usando para la paginación en mi aplicación:

 public static PagedList<T> ToPagedList(IEnumerable<T> source, int pageNumber, int pageSize) { var count = source.Count(); var items = source .Skip((pageNumber - 1) * pageSize) .Take(pageSize).ToList(); return new PagedList<T>(items, count, pageNumber, pageSize); }

En este método, paso una colección de objetos genéricos como IEnumerable<T> source que, independientemente del tipo, siempre tendrá un campo Id. Lo que me gustaría hacer es extraer todos los Id. de estos objetos y almacenarlos en una lista para pasarlos a mi constructor PagedList. es posible?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Sí, es posible. Puede usar Reflection para obtener el valor de una propiedad.

 item.GetType().GetProperty("Id").GetValue(item, null);

Editar: responder al comentario de @CoolBots

En caso de que Id sea un campo, puede usar GetField en lugar de GetProperty

 item.GetType().GetField("Id").GetValue(item, null);

pero si el elemento no tiene la propiedad "Id", este código fallará, así que recuerde verificar si hay nulos.

over 4 years ago · Santiago Trujillo Denunciar

0

la mejor manera sería crear una interfaz

 public interface IBaseClass{ public int Id {get; set;} }

en este caso, podría cambiar el encabezado del método

 static PagedList<T> ToPagedList<T>(IEnumerable<T> source, int pageNumber, int pageSize) where T : IBaseClass

e identificaciones

 var ids=items.Select(i => i.Id ).ToList();
over 4 years ago · Santiago Trujillo Denunciar

0

Una interfaz sería la mejor manera, pero usted dijo específicamente "campo" y las interfaces no pueden contener campos.

Puede sortear esta limitación con una clase base abstracta, pero no puede tener varias clases base en una sola clase (si corresponde).

... Todo esto supone que tienes la capacidad de modificar esas clases.

Otra forma de hacer esto sería:

 public static PagedList<T> ToPagedList<T>(IEnumerable<T> source, int pageNumber, int pageSize) { var count = source.Count(); var items = source .Skip((pageNumber - 1) * pageSize) .Take(pageSize).ToList(); var ids = items .Select(i => ((dynamic)i).Id) // field is **always** named "Id" .Cast<int>() // its type is **always** int .ToList(); return new PagedList<T>(items, count, pageNumber, pageSize/*, ids*/); // pass ids }

Esto supone que el campo en cuestión se llama "Id", y es un int .

Ajuste en consecuencia y maneje los posibles errores.

Creo que originalmente no entendí bien la pregunta, el comentario de @Dusan me hizo reevaluar y actualizar el código.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda