У меня есть общий интерфейс и класс, реализующий этот интерфейс с конкретным параметром типа. У меня также есть общий класс, использующий общий интерфейс в качестве ограничения типа, но параметр типа ограничен как подкласс определенного базового класса. Я хочу указать общий класс с классом, реализующим этот интерфейс, но с проблемой преобразования класса в этот интерфейс. Следующий код иллюстрирует все классы я говорил:Варианты общих интерфейсов
базовый класс:
class DomainBase
{
}
класс, используемый в качестве параметра типа в интерфейсе
class Person : DomainBase
{
}
общий интерфейс:
public interface IRepository<T> where T : class
{
IEnumerable<T> Fetch();
T Persist(T item);
}
Класс, реализующий общий интерфейс:
class PersonRepository : IRepository<Person>
{
public IEnumerable<Person> Fetch()
{
...
}
public Person Persist(Person item)
{
...
}
}
Общий класс с использованием универсального интерфейса:
class DomainBaseViewModel<Repository>
where Repository : IRepository<DomainBase>, new()
{
private Repository repository = new Repository();
private ObservableCollection<DomainBase> items;
}
Однако, следующая строка не может получить скомпилированные, потому что PersonRepository не может быть преобразован в IRepository <DomainBase>:
var viewModel = new DomainBaseViewModel<PersonRepository>();
Хотя я могу решить эту проблему по ковариации, но она запрещает использование параметра типа в списках параметров:
public interface IRepository<out T> where T : class
{
...
T Persist(object item);
}
class PersonRepository : IRepository<Person>
{
public Person Persist(object item)
{
...
}
}
Поэтому мне нужно преобразовать параметр в Person, что ставит под угрозу безопасность типов.
Есть ли лучший способ разрешить ковариацию и использование параметра типа в списках параметров в этом случае?
О, вы сделали большую точку, я не думал о. То, что я должен был сделать, будет классом, реализующим интерфейс с параметром типа DomainBase, например, классом DomainBaseRepository: IRepository. –