2

私はオブジェクト階層を持っています:

MyObject
+Variable
+etc.

(したがって、MyObject は基本クラスで、Variable はサブクラスの 1 つです)。

特定のタイプの辞書があります

private ConcurrentDictionary<string, Variable> variables 
    = new ConcurrentDictionary<string, Variable>();

そして、さまざまなリストをすべて 1 つの高レベル辞書に入れたいと思います。ここで、すべての特定のリストを見つけることができます。

private Dictionary<Type, ConcurrentDictionary<string, MyObject>> objects 
    = new Dictionary<Type, ConcurrentDictionary<string, MyObject>>();

しかし、特定の辞書を高レベルの辞書に追加することはできません:

objects.Add(typeof(Variable), variables); // DOES NOT COMPILE

私がやりたいことをする手段はありますか?変数リストを次のように定義したくありません

private ConcurrentDictionary<string, MyObject> variables 
    = new ConcurrentDictionary<string, MyObject>(); // WORKS, BUT NOT NICE TO USE

したがって、特定のリストを使用してタイプ固有の操作を実行するだけでなく、「オブジェクト」ディクショナリを介してすべてのオブジェクト タイプで一般的な操作を有効にして、サブタイプごとにすべてを手動でコーディングする必要がないようにします。

たとえば、次のようなメソッドを定義したいと思います。

    public List<Variable> GetVariables()
    {
        return variables.Values.ToList();
    }

したがって、変数オブジェクトがすべて変数であることがわかっている場合は、変数オブジェクトを使用できます。

4

1 に答える 1

0

例でわかるように、型のオブジェクトと型ConcurrentDictionary<string, Variable>のオブジェクトをConcurrentDictionary<string, MyObject>の 2 番目の引数として強い型を持つ辞書に追加しようとしているため、達成しようとしていることが不可能ですConcurrentDictionary<string, MyObject>。したがって、最初のタイプのオブジェクトを追加することはできません。オブジェクトの第2引数としてdoubleandを追加したい場合のように、それは不可能です。stringDictionary<int, string>

しかし、実行可能な回避策があります。すべてのタイプ(MyObject, Variableなど)が同じインターフェイスから派生している場合、次のようなことができます:

public interface MyInterface
{          
}

public class MyObject:MyInterface
{
}

public class Variable:MyInterface
{
}

あなたが望むものと同様に、このコードを呼び出すことができます。必要なディクショナリを取得するときは、オブジェクトを特定の型にキャストするか、一般的なメソッドを使用すると、ポリモーフィズムがその目的を果たします。

ConcurrentDictionary<string, MyInterface> myClass1Dict = new ConcurrentDictionary<string, MyInterface>();
myClass1Dict.TryAdd("one", new MyObject());
myClass1Dict.TryAdd("two", new MyObject());
ConcurrentDictionary<string, MyInterface> myClass2Dict = new ConcurrentDictionary<string, MyInterface>();
myClass1Dict.TryAdd("one", new Variable());
myClass1Dict.TryAdd("two", new Variable());
ConcurrentDictionary<Type, ConcurrentDictionary<string, MyInterface>> objectDict = new ConcurrentDictionary<Type, ConcurrentDictionary<string, MyInterface>>();
objectDict.TryAdd(Type.GetType(MyObject), myClass1Dict);
objectDict.TryAdd(Type.GetType(Variable), myClass2Dict);
于 2013-02-27T10:08:38.843 に答える