我有一个对象层次结构:
MyObject
+Variable
+etc.
(所以MyObject是基类,而Variable是其中一个子类。)
我有特定类型的词典
private ConcurrentDictionary<string, Variable> variables
= new ConcurrentDictionary<string, Variable>();
等
我希望将所有各种列表放在一个高级词典中,在那里我会找到所有特定的列表:
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
所以我想使用特定的列表来执行特定于类型的操作,还要通过'objects'字典对所有对象类型启用泛型操作,这样我就不需要为每个子类型手动编写所有代码。
例如,我想定义一个这样的方法:
public List<Variable> GetVariables()
{
return variables.Values.ToList();
}
所以当我知道它们都是变量时,我可以使用Variable对象。
答案 0 :(得分:0)
正如您在示例中所看到的,由于您尝试将类型为ConcurrentDictionary<string, Variable>
的对象和类型为ConcurrentDictionary<string, MyObject>
的对象添加到具有强类型的字典中,因此您无法实现的目标作为ConcurrentDictionary<string, MyObject>
的第二个参数。因此,您无法添加第一种类型的对象。就像你想要double
和string
作为Dictionary<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);