Interfaz genérica y herencia en C#
Tengo una interfaz genérica que hereda de otra interfaz genérica de una biblioteca de terceros (lo que hace imposible utilizar covarianza y contravarianza).
Aquí está mi código
public interface IFABaseAppService<tdto, tkey=""> : ICrudAppService<tdto, tkey=""> where TDto : FABaseDto
{
}
Tengo otra interfaz IUserAppService
public interface IUserAppService : IFABaseAppService<userdto, guid="">
{
}
Luego tengo una clase base que acepta IFABaseAppService<fabasedto, guid="">
como parámetro en el constructor.
public class FABaseStandardFormViewModel : FABaseViewModel
{
public FABaseStandardFormViewModel(IFABaseAppService<fabasedto, guid=""> appService) : base(appService)
{
}
}
Luego he creado una clase que acepta IUserAppService
en el constructor y lo pasa a la clase base, pero me está dando el siguiente error:
no se puede convertir de ‘FinancialsAce.ApplicationServices.Common.IUserAppService’ a ‘FinancialsAce.ApplicationServices.IFABaseAppService<financialsace.datatransferobjects.fabasedto, system.guid=””>'</financialsace.datatransferobjects.fabasedto,></fabasedto,></fabasedto,></userdto,></tdto,></tdto,>
davy.ai
Como experto en TI especializado en C#, genéricos, herencia e interfaces, el error está ocurriendo porque la interfaz
IUserAppService
está heredando de la interfazIFABaseAppService
con tipos específicos (UserDto
yGuid
). Por lo tanto, cuando intentas pasarIUserAppService
al constructor deFABaseStandardFormViewModel
, que espera unIFABaseAppService<fabasedto, guid="">
, los tipos no concuerdan y se produce un error de conversión.Para resolver este problema, puedes crear una nueva interfaz llamada
IFABaseUserAppService
que herede deIFABaseAppService<fabasedto, guid="">
con el parámetro de tipoUserDto
paraTDto
. Luego, haz queIUserAppService
herede de esta nueva interfazIFABaseUserAppService
. De esta manera, podrás pasarIUserAppService
al constructor deFABaseStandardFormViewModel
.Aquí tienes un ejemplo de implementación:
Ahora puedes crear una instancia de
UserViewModel
con un parámetroIUserAppService
, y será aceptado por el constructor deFABaseStandardFormViewModel
.</fabasedto,></tdto,></fabasedto,></fabasedto,>