C # - переопределение типа возврата из интерфейса с производным типом с использованием обобщений - PullRequest
0 голосов
/ 11 декабря 2018

Моя цель - иметь словарь, в котором хранятся различные объекты-контейнеры, полученные из интерфейса IContainer.Пользователь может добавить различные объекты-контейнеры (если они реализуют IContainer) в этот словарь.Контейнеры могут добавлять элементы, относящиеся к контейнеру (например, configContainer добавит configElements, diContainer добавит diConfigElements).

Элементы также реализованы из интерфейса.Я хочу избежать сценария добавления DiConfigElements в ConfigContainer.Я посмотрел на связанные вопросы, и они не совсем решают мою проблему.Я чувствую, что дженерики решат мою проблему, у меня есть пример, но я получаю Аргумент 2: не могу преобразовать из 'ConfigContainer' в 'IContainer' Я использую Unity C #.

test.cs

using System.Collections;
using System.Collections.Generic;

public class test
{
    public Dictionary<string, IContainer<IResolveableItem>> containers;
    // Use this for initialization
    void Start()
    {
        containers = new Dictionary<string, IContainer<IResolveableItem>>();
        ConfigContainer configContainer = new ConfigContainer();
        ConfigContainerElement configElement = new ConfigContainerElement();
        configElement.Name = "configTest";
        configElement.Path = "configTest/configTest";
        configContainer.Add("test1", configElement);

        containers.Add("config",configContainer);
    }
}

IContainer.cs

using System.Collections;

public interface IContainer<T> where T : IResolveableItem
{
    void Add(string key , T value);
}

ConfigContainer.cs

using System.Collections.Generic;

public class ConfigContainer : IContainer<ConfigContainerElement>
{
    public Dictionary<string, IResolveableItem> container = new Dictionary<string, IResolveableItem>();

    public void Add(string key, ConfigContainerElement value)
    {
        throw new System.NotImplementedException();
    }
}

ConfigContainerElement.cs

using System.Collections;

public class ConfigContainerElement : IResolveableItem
{
    protected string name;
    protected string path;

    public string Name
    {
        get
        {
            return name;
        }

        set
        {
            name = value;
        }
    }

    public string Path
    {
        get
        {
            return path;
        }

        set
        {
            path = value;
        }
    }
}

IResolveableItem.cs

using System.Collections;

public interface IResolveableItem
{
    string Name { get; set; }
    string Path { get; set; }
}

1 Ответ

0 голосов
/ 11 декабря 2018

Это ограничение генериков, придется использовать проверку во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...