Моя цель - иметь словарь, в котором хранятся различные объекты-контейнеры, полученные из интерфейса 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; }
}