2

我目前正在开发一个用于存储和检索主字典类中的数据的系统。想象一下这样的事情:

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...等)。

通过添加“where”类型约束以确保它实现我的接口,我可以确保它仅适用于旨在使用它的类。我只是不确定如何设置我的“类别”类,使其可以存储和检索任何“IExampleInterface<>”——如果可能的话。

我希望能够将它用于所有包含主要类型(string/int/float/bool ...)的不同项目 - 但也有自己的自定义结构和类。

预先感谢您对此事的任何意见,我一直在努力自己解决这个问题 - 但它肯定会让我变得更好。

4

1 回答 1

1

我没有完成所有代码,但看起来你想要一个

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

或者也许是

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

您正确地发现泛型不是“动态的”。如果你想混合不同的类型,你将需要类型转换。

于 2011-05-21T20:28:36.020 回答