Итак, моя цель - создать класс (ProviderManager), который вы можете попросить вернуть объект по типу, например так:
var a = ProviderManager.GetObject<ObjA>();
ProviderManager содержит словарь, который отображает типы для делегатов, этих делегатов. являются классами, которые создают объекты конкретного типа (Provider>. Когда вызывается GetObject, ProviderManager вызывает функцию, которая создает конкретный объект. Поставщики реализуются в отдельном проекте.
Provider Manager
public class ProviderManager
{
private readonly Dictionary<Type, Action> _ProviderMapping = new Dictionary<Type, Action>();
public void Register<T>(Type objType, IProvider<T> provider)
{
_ProviderMapping.Add(objType, provider.GetObject());
}
public T GetObject<T>()
{
_ProviderMapping.FirstOrDefault(t => t.Key == typeof(T)).Value();
}
}
Интерфейс провайдера
public interface IProvider<T>
{
void Register();
T GetObject();
}
Пример провайдера
public class ProviderForA : IProvider<ObjA>
{
private ProviderManager _Manager;
public ProviderForA(ProviderManager manager)
{
_Manager = manager;
}
public void Register()
{
_Manager.Register(typeof(ObjA), this);
}
public ObjA GetObject()
{
return new ObjA();
}
}
Проблема заключается в том, что _ProviderMapping.Add (objType, provider.GetObject () ) ; вызывает ошибку «невозможно преобразовать T в Sytem.Action». Добавление функции void работает, поэтому я предполагаю, что она связана с возвращаемым значением. Я также пытался добавить универсальный c возвращаемый тип в Action, но это также не дает работа.
Цель состоит в том, чтобы проект (модуль провайдера) отвечал за создание объектов, он регистрирует класс, который реализует интерфейс провайдера. rface у менеджера провайдера (менеджерский модуль). Затем пользовательский код запрашивает у модуля менеджера объект конкретного типа. Менеджер перенаправляет вызов поставщику, который возвращает фактический объект.