我目前正在开发一个用于存储和检索主字典类中的数据的系统。想象一下这样的事情:
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 ...)的不同项目 - 但也有自己的自定义结构和类。
预先感谢您对此事的任何意见,我一直在努力自己解决这个问题 - 但它肯定会让我变得更好。