C# - 辞書管理クラスに変数型を追加するための拡張方法
-
09-09-2020 - |
質問
現在マスタディクショナリクラスからデータを保存および取得するためのシステムに取り組んでいます。このようなものを想像してみてください:
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との間でシリアル化/逆シリアライズします。私はすでに機能するものを持っています、そしてそれは素晴らしい動作ですが、マネージャ/カテゴリクラスを編集せずに新しいデータ型のサポートを追加することは不可能です(getvalueの代わりにgetString / getfloat / getint / getBool / getVector3 ...など。
私はそれが私のインターフェースを実装するために "WHERE"タイプの制約を追加することによってそれを使って作業するように設計されているクラスと実際にのみ実際に動作するようにすることができます。 「iexampleInterface <>」を保存して取得できるように、「Category」クラスの設定方法がわからない。
これは、メジャータイプ(string / int / float / bool ...)を含むさまざまなプロジェクトにこれを使用できるようにしたいです。ただし、独自のカスタム構造体やクラスもあります。
この問題についての入力をお願いします、私は自分でそれを理解しようとしています - しかしそれは確かに私の方を良くなっています。
解決
私はすべてのコードを扱っていませんでしたが、
が欲しいようです Dictionary<object, Dictionary<string, object> _categoryDict;
.
または多分
Dictionary<Type, Dictionary<string, object> _categoryDict;
.
Genericsが「動的」ではないことを正しく発見しました。さまざまな種類を混ぜたい場合は、タイプキャスティングが必要になります。