在代码审查中,我发现了一些有趣的结构:
public ActionResult SeatMap(string name)
{
var equimpment = this.CustomResourcesCache.GetAllEquipment(name);
if (string.IsNullOrEmpty(name))
{
List<dynamic> all = new List<dynamic>();
foreach (var item in equimpment)
{
all.Add(item.Tag[0]);
}
return CachedResult(new { SeatMaps = all } );
}
return CachedResult(new { SeatMaps = equimpment.Where(o => o.Key == name).Count()>0?equimpment.Where(o => o.Key == name).First().Tag:new List<dynamic>() });
}
我只是想知道为什么他们使用List&lt;&lt; [dynamic]&gt;&gt;代替List&lt;&lt; [T]&gt;&gt;还有其他解决方案,而不是这个。
由于
答案 0 :(得分:2)
这是一个罕见的情况,我会发现此代码可以接受。
我们说GetAllEquipment
会返回Equipment
的列表。 Equipment
不包含此代码所需的Key
属性,但作为各种设备类的基类,所有设备类都具有Key
属性,但它们不具备T
属性。共享一个界面。
在这种情况下,您可以将List<T>
放入Equipment
。
现在,如果您拥有Key
及其子代的代码,解决方案是在内部创建一个带有T
的共享接口(并将此接口用作List<dynamic>
)。
但是,如果您不拥有代码,就好像它是第三方库一样,那么使用Equipment
似乎是可以接受的,并且理解未来对该库的更改可能会破坏您的代码(即如果他们将新孩子介绍给Key
并且没有HashMap<String, Integer> map = new HashMap<String, Integer>();
for (String s : list) {
if (map.containsKey(s)) {
map.put(s, map.get(s) + 1);
} else {
map.put(s, 1);
}
}
属性的孩子。