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?
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.
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();
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.