【发布时间】:2015-11-11 17:42:57
【问题描述】:
我有几本词典:
Dictionary<int, Type1> Type1Dictionary { get; set; }
Dictionary<int, Type2> Type2Dictionary { get; set; }
Dictionary<int, Type3> Type3Dictionary { get; set; }
Dictionary<int, Type4> Type4Dictionary { get; set; }
Typei (i = 1..4) 派生自同一个基类 (BaseType)。我想要一个返回给定类型的字典引用的方法。稍后,我将对该字典执行一些操作,例如添加或删除:
Type1 example = new Type1();
var dic = GetDictionary(example);
dic.Add(example.ID, example);
注意:我不想将我的字典设置为Dictionary<int, BaseType>
我可以写这样的东西,但不会返回对字典的引用:
Dictionary<int, BaseType> GetDictionary(BaseType myObject)
{
var dic = new Dictionary<int, BaseType>();
if(myObject is Type1)
{
//ideally I would return my Type1Dictionary here but I can't due type incompatibility
foreach(var x in Type1Dictionary)
{
dic.Add(x.Key, x.Value);
}
return dic;
}
if(myObject is Type2) { /*...*/ }
if(myObject is Type3) { /*...*/ }
if(myObject is Type4) { /*...*/ }
}
编辑:
我真正想要的是避免以下结构:
AddObject(BaseType x)
{
Type1 x1 = x as Type1;
if(x1 != null) { Type1Dictionary.Add(x1.ID, x1); }
Type2 x2 = x as Type2;
if(x2 != null) { Type2Dictionary.Add(x2.ID, x2); }
Type3 x3 = x as Type3;
if(x3 != null) { Type3Dictionary.Add(x3.ID, x3); }
Type4 x4 = x as Type4;
if(x4 != null) { Type4Dictionary.Add(x4.ID, x4); }
}
RemoveObject(BaseType x)
{
Type1 x1 = x as Type1;
if(x1 != null) { Type1Dictionary.Remove(x1.ID); }
Type2 x2 = x as Type2;
if(x2 != null) { Type2Dictionary.Remove(x2.ID); }
Type3 x3 = x as Type3;
if(x3 != null) { Type3Dictionary.Remove(x3.ID); }
Type4 x4 = x as Type4;
if(x4 != null) { Type4Dictionary.Remove(x4.ID); }
}
但是:
AddObject(BaseType x)
{
var dic = GetDictionary(x);
dic.Add(x.ID, x);
}
RemoveObject(BaseType x)
{
var dic = GetDictionary(x);
dic.Remove(x.ID);
}
【问题讨论】:
-
您不想要一本从
int映射到BaseType的字典,但您返回的字典做同样的事情? -
我不想让
Type2对象与Type1在同一个字典中。但是为了删除或添加一个对象,我真的不在乎字典是如何处理的(如果它是正确的类型)。我写的代码并没有解决我的问题,顺便说一句。 -
听起来像是访问者模式的候选者,或者使用
dynamic并将问题移至 DLR。
标签: c#