J'ai une application structurée comme une couche de service qui utilise une couche de référentiel pour la persistance. J'essaye de créer une classe de contrôleur générique pour réutiliser le comportement partagé mais j'ai du mal à essayer de définir les paramètres génériques. Le code suivant:Conversion implicite en classes génériques C#
public class BusinessEntity
{ }
public class Person : BusinessEntity
{ }
public interface IRepository<T> where T : BusinessEntity
{ }
public interface IService<T, R>
where T : BusinessEntity
where R : IRepository<T>
{ }
public partial interface IPersonRepository : IRepository<Person>
{ }
public interface IPersonService : IService<Person, IPersonRepository>
{ }
public abstract class BaseController<X, Y>
where X : BusinessEntity
where Y : IService<X, IRepository<X>>
{ }
public class PersonController : BaseController<Person, IPersonService>
{ }
échoue à la compilation avec
Le type ConsoleApplication.IPersonService
ne peut pas être utilisé comme paramètre de type Y
dans le type générique ou méthode ConsoleApplication.BaseController<X,Y>
. Il n'y a pas de conversion de référence implicite ConsoleApplication.IPersonService
-ConsoleApplication.IService<ConsoleApplication.Person,ConsoleApplication.IRepository<ConsoleApplication.Person>>
cela fonctionne
public interface IPersonService : IService<Person, IRepository<Person>>
mais je perdre le référentiel personnalisé
Il y a un moyen de rendre le compilateur est un IPersonRepository
réalisons des IRepository<Person>
?
droit est ce parce que 'IRepository où X: Person' n'est pas la même chose que 'IRepository ' par défaut, aucune variance pour ces types génériques par défaut. Quelle version de .NET Framework utilisez-vous? –
sll
Si j'avais la capacité, je vous décernerais un badge "a cassé le compilateur". De toutes les 5 minutes que j'ai passées à essayer de le faire fonctionner, ma conclusion est que le compilateur n'est pas assez intelligent pour faire ce que vous voulez qu'il fasse. – PlayDeezGames
J'utilise .Net 4. Je n'ai pas pensé à la variance, je pense que ça mérite un essai. –