【问题标题】:C# - Extensible method for adding variable types to a dictionary management classC# - 将变量类型添加到字典管理类的可扩展方法
【发布时间】:2011-08-30 08:45:25
【问题描述】:

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

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&lt;T, Dictionary&lt;string, IElementExample&lt;T&gt;&gt;。有没有人对我如何能够完成类似的事情有任何想法?

这里的目标是创建一个可以存储大量数据的主位置(用于游戏配置变量),然后我将对 XML 进行序列化/反序列化。我已经有一些东西可以解决这个问题,而且效果很好,但是如果不编辑 Manager/Category 类来添加支持,就不可能添加对新数据类型的支持(目前不是 GetValue,而是 GetString/GetFloat/GetInt/ GetBool/GetVector3...等)。

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

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

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

【问题讨论】:

    标签: c# generics dictionary extensible


    【解决方案1】:

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

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

    或者可能是一个

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

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

    【讨论】:

    • 谢谢!我设法做到了足够远,以确保这实际上会很好地工作。然而,它突出了我的主要目标的其他一些问题——看起来泛型根本不是解决这个问题的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2020-04-15
    • 2016-06-28
    • 2017-09-22
    • 2018-11-18
    • 2019-11-22
    相关资源
    最近更新 更多