C # Как привести общий тип к интерфейсу, который он реализует - PullRequest
0 голосов
/ 11 октября 2019

Это может быть глупый вопрос, но я не могу найти решение для него.

У меня есть эта структура (упрощенная для краткости):

namespace Test
{
    public interface IEntity
    { }

    public class BaseEntity : IEntity 
    { }

    public class OneEntity : BaseEntity
    { }

    public class Configuration<T> where T : IEntity 
    {

    }

    public class Service 
    {
        public Dictionary<string, Configuration<IEntity>> Configurations = new Dictionary<string, Configuration<IEntity>>();

        public void RegisterConfiguration(string name, Configuration<T> configuration) where T : IEntity
        {
            if(Configurations.ContainsKey(name))
                return;

            Configurations.Add(name, configuration); //Error: Unable to convert Configuration<T> to Configuration<IEntity>
        }
    }
}

Я думаю, я не могу преобразоватьуниверсальный тип интерфейса, но как мне этого добиться? Я мог бы написать RegisterConfiguration как:
public void RegisterConfiguration(string name, Configuration<IEntity> configuration), но тогда я не смог бы вызвать его с помощью одной из моих сущностей (даже если все они реализуют IEntity).

Должно быть что-то, что я не правильно понял с помощью дженериков, но я не могу понять, что.

Ответы [ 2 ]

3 голосов
/ 11 октября 2019

Попробуй так:

public class Service<T> where T : IEntity
{
  public Dictionary<string, Configuration<T>> Configurations = new Dictionary<string, Configuration<T>>();

  public void RegisterConfiguration(string name, Configuration<T> configuration)
  {
    if (Configurations.ContainsKey(name))
      return;

    Configurations.Add(name, configuration);
  }
}
0 голосов
/ 11 октября 2019

Это должно работать: причина в том, что вы можете приводить из шаблона в интерфейс, но не в обратном направлении, а также на уровне класса он должен знать определение шаблона

public class Service<T>  where T : IEntity
{
    public Dictionary<string, Configuration<T>> Configurations = new Dictionary<string, Configuration<T>>();

    public void RegisterConfiguration(string name, Configuration<T> configuration) 
    {
        if (Configurations.ContainsKey(name))
            return;

        Configurations.Add(name, configuration); //Error: Unable to convert Configuration<T> to Configuration<IEntity>
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...