Haciendo un método genérico.
Tengo el siguiente objeto:
public class Store : BaseEntity
{
public virtual List<consumerclubdto>? RelatedConsumerClubs { get; set; }
public virtual List<giftdto>? RelatedGifts { get; set; }
}
Estas dos listas implementan la misma interfaz.
Tengo el siguiente método de extensión que se ejecuta en cada lista. En este momento, tengo duplicado este método: uno se ejecuta en ConsumerClubDto y el otro en GiftDto.
public static async Task UpdateList(this List<consumerclubdto>? clubsDto, Store storeFromRepo, AppDbContext dbContext)
{
if (clubsDto?.Count > 0)
{
foreach (ConsumerClubDto clubDto in clubsDto)
{
if ((storeFromRepo.RelatedConsumerClubs?.FindIndex(x => x.Id == clubDto.Id) == -1))
{
ConsumerClub t = await dbContext.ConsumerClubs.FindAsync(clubDto.Id);
storeFromRepo.RelatedConsumerClubs.Add(t);
}
}
List<consumerclub> clubsToRemove = new List<consumerclub>();
foreach (ConsumerClub club in storeFromRepo.RelatedConsumerClubs)
{
if (clubsDto.FindIndex(x => x.Id == club.Id) == -1)
clubsToRemove.Add(club);
}
if (clubsToRemove.Count > 0)
{
foreach (ConsumerClub club in clubsToRemove)
storeFromRepo.RelatedConsumerClubs.Remove(club);
}
}
}
Estoy seguro de que puedo escribir un método genérico y evitar duplicar el código. No estoy seguro de cómo hacerlo.
Se aceptan sugerencias.
davy.ai
Para evitar duplicar el código y crear un método genérico, puedes seguir estos pasos:
Aquí tienes un ejemplo de cómo podría verse el método genérico:
Ten en cuenta que utiliza la interfaz
IRelatedDto
en lugar de ConsumerClubDto o GiftDto, y el métodoSet
dedbContext
para consultar la base de datos para el tipo T. También ten en cuenta el uso del operadoras
para convertir el elemento aConsumerClub
antes de agregarlo a la lista.Finalmente, para llamar al nuevo método genérico, harías algo como esto:
donde
clubsDto
ygiftsDto
son la lista de objetos que se van a actualizar, ydbContext
es el contexto de la base de datos.