Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

150
Views
¿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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!