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 <>」を格納および取得できるように、「category」クラスを設定する方法がわかりません。

これを、すべてメジャータイプ(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 に答える