何时使用List <dynamic>而不是List <t>

时间:2015-07-10 10:28:51

标签: c# asp.net generics dynamic

在代码审查中,我发现了一些有趣的结构:

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;还有其他解决方案,而不是这个。

由于

1 个答案:

答案 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); } } 属性的孩子。