C # - Создать словарь <T, менеджер <T>> - PullRequest
5 голосов
/ 24 декабря 2011

У меня есть универсальный класс с именем Manager<T>, и я хочу создать словарь, который отображает тип на экземпляр класса Manager этого типа.Я думал о создании класса Dictionary, производного от Dictionary, но переопределение всех его методов кажется излишним.Идеи?Спасибо.

Ответы [ 4 ]

2 голосов
/ 24 декабря 2011

Я думаю, что это случай, который дженерики не поддерживают хорошо, возможно, это то, что вы хотите.Вам нужно будет хранить менеджеры для этого, поскольку в качестве хранилища можно использовать Dictionary<Type,Object> или Dictionary<Type,IManager>, где IManager - это маркерный (пустой) интерфейс, примененный к Manager<T>. Затем вам нужно будет привести его к типу T, указанному ранеевозвращая это.Я не могу придумать хороший способ получить доступ к этому через индексатор, так что это может быть лучшее, что вы можете получить

public class ManagerDictionary{
    private Dictionary<Type, object> _managers = new Dictionary<Type, object>();

    public Manager<T> GetManager<T>()
    {
        if (_managers.ContainsKey(typeof(T)))
        {
            return _managers[typeof(T)] as Manager<T>;
        }
        throw new ArgumentException("No manager of " + typeof(T).Name + " could be found");
    }

    public void AddManager<T>(Manager<T> manager)
    {
        _managers.Add(typeof(T),manager);
    }
}
2 голосов
/ 24 декабря 2011

Предполагая, что ваш словарь должен содержать менеджеры со смешанными аргументами типа, вы можете реализовать интерфейс IManager в Manager<T>, сделать Dictionary<Type,IManager> и добавить универсальную оболочку для приведения экземпляров обратно к Maanger<T>, например это:

interface IManager {
    // Properties and methods common to all Maanger<T>, regardless of T
}

class Manager<T> : IManager {
}

class Main {
    private readonly IDictionary<Type,IManager> managers =
        new Dictionary<Type,IManager>();

    bool TryGetManager<T>(Type key, out Manager<T> manager) {
        IManager res;
        return managers.TryGetValue(key, out res) ? ((Manager<T>)res) : null;
    }
}
1 голос
/ 24 декабря 2011

Для того, чтобы это работало, вам действительно необходим интерфейс, из которого происходит T. Тогда ваш менеджерский класс может работать с любым конкретным T, который вы передаете.

class Manager<T> where T: IMyClass

Это хорошая практика, так как методы интерфейса делают универсальный T.

Для большего количества идей вы можете взглянуть на Командный шаблон

У вас будет какой-то переключатель или словарь для обслуживания, но вы сможете найти хорошее решение.

0 голосов
/ 24 декабря 2011

Я думаю, что этот код сделает это:

class ManagerDictionary<T> : Dictionary<T, Manager<T>> {

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