es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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,>

Tags:  , , ,

Answer

  1. Avatar for 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 interfaz IFABaseAppService con tipos específicos (UserDto y Guid). Por lo tanto, cuando intentas pasar IUserAppService al constructor de FABaseStandardFormViewModel, que espera un IFABaseAppService<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 de IFABaseAppService<fabasedto, guid=""> con el parámetro de tipo UserDto para TDto. Luego, haz que IUserAppService herede de esta nueva interfaz IFABaseUserAppService. De esta manera, podrás pasar IUserAppService al constructor de FABaseStandardFormViewModel.

    Aquí tienes un ejemplo de implementación:

    public interface IFABaseUserAppService<tdto> : IFABaseAppService<tdto, guid=""> where TDto : UserDto
    {
    }
    
    public interface IUserAppService : IFABaseUserAppService<userdto>
    {
    }
    
    public class FABaseStandardFormViewModel : FABaseViewModel
    {
        public FABaseStandardFormViewModel(IFABaseAppService<fabasedto, guid=""> appService) : base(appService)
        {
        }
    }
    
    public class UserViewModel : FABaseStandardFormViewModel
    {
        public UserViewModel(IUserAppService userAppService) : base(userAppService)
        {
        }
    }
    

    Ahora puedes crear una instancia de UserViewModel con un parámetro IUserAppService, y será aceptado por el constructor de FABaseStandardFormViewModel.</fabasedto,></tdto,></fabasedto,></fabasedto,>

Comments are closed.