C # - Расширяемый метод для добавления типов переменных в класс управления словаря - PullRequest
2 голосов
/ 22 мая 2011

В настоящее время я работаю над системой для хранения и извлечения данных из мастер-класса словаря. Представьте себе что-то вроде этого:

public class Manager {
    Dictionary<string, Category> _categories;

    public T GetValue<T>(string category, string id){
        return _categories[category].GetValue<T>(id);
    }
}

public class Category {
    Dictionary<string, Category> _subCategories;

    // How could I approach something like this?
    Dictionary<T, Dictionary<string, IElementExample<T>> _categoryDict;

    public T GetValue<T>(string id){
        if (_categoryDict.ContainsKey(T)){
            return _categoryDict[T][id];
        }
        return default(T);
    }
    public SetValue<T>(string id, T value){
        if (_categoryDict.ContainsKey(T)){
            if (_categoryDict[T].ContainsKey(id)){
                _categoryDict[T][id] = value;
            } else {
                _categoryDict[T].Add(id, value);
            }
        } else {
            _categoryDict.Add(T, new Dictionary<string, IElementExample<T>>());
            _categoryDict[T].Add(id, value);
        }
    }
}

//
public interface IElementExample<T> {
    T Value {get;set;}
    string Id {get;set;}
    string Comment{get;set;}

    string Serialize();
    void Deserialize(string serial);
}

public class StringElement : IElementExample<string> {
    string m_value;
    string m_id;
    string m_comment;

    string Value { get { return m_value; }}
    string Id { get { return m_id; }}
    string Comment { get { return m_comment; }}

    string Serialize(){

    }
    void Deserialize(){

    }
}

Меня сбивает с толку то, что на самом деле я не могу получить Dictionary<T, Dictionary<string, IElementExample<T>>. У кого-нибудь есть мысли о том, как я смогу достичь чего-то подобного?

Целью здесь является создание мастер-места, где может храниться много данных (для переменных конфигурации игры), которые затем я буду сериализовывать / десериализовывать в / из XML. У меня уже есть кое-что, что работает для этого, и это прекрасно работает, но невозможно добавить поддержку новых типов данных без редактирования классов Manager / Category для добавления поддержки (на данный момент вместо GetValue это GetString / GetFloat / GetInt / GetBool / GetVector3 ... и т. Д.).

Я могу убедиться, что он действительно работает только с классами, предназначенными для работы с ним, добавив ограничение типа "где", чтобы гарантировать, что он реализует мой интерфейс. Я просто не уверен, как настроить мой класс «категория» таким образом, чтобы он мог хранить и извлекать любой «IExampleInterface <>» - если это вообще возможно.

Я хотел бы иметь возможность использовать это для различных проектов, которые содержат основные типы (string / int / float / bool ...), но также имеют свои собственные структуры и классы.

Заранее благодарю за любой вклад в этот вопрос, я пытался разобраться сам - но он наверняка одолеет меня.

1 Ответ

1 голос
/ 22 мая 2011

Я не работал через весь код, но похоже, что вы хотите

 Dictionary<object, Dictionary<string, object> _categoryDict;

или, может быть,

Dictionary<Type, Dictionary<string, object> _categoryDict;

Вы правильно обнаружили, что генерики не являются "динамическими",Если вы хотите смешивать разные типы, вам понадобится приведение типов.

...