Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

151
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda