【问题标题】:When to use List<dynamic> instead of List<T> [closed]何时使用 List<dynamic> 而不是 List<T> [关闭]
【发布时间】:2015-09-29 01:39:54
【问题描述】:

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

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 > 而不是 List> 并且有没有其他解决方案来代替这个。

谢谢

【问题讨论】:

  • 在我看来你需要学习动态。然后你就可以回答你的问题了。
  • @Dilshod 我不认为你理解这个问题。这与dynamic 无关,而是为什么要使用它。
  • @PanagiotisKanavos 代码解释与CR.SE 无关
  • 我投票结束这个问题,因为它是关于解释现有代码,而不是解决问题。

标签: c# asp.net generics dynamic


【解决方案1】:

这是我认为此代码可接受的一种罕见情况。

假设GetAllEquipment 返回Equipment 的列表。 Equipment 不包含此代码所需的Key 属性,而是作为各种设备类的基类,所有设备类都具有Key 属性,但它们不共享接口。 在这种情况下,没有T 可以输入List&lt;T&gt;

现在,如果您拥有Equipment 及其子代的代码,则解决方案是创建一个内部包含Key 的共享接口(并将此接口用作您的T)。

但是,如果您不拥有该代码,例如如果它是第三方库,那么使用 List&lt;dynamic&gt; 似乎是可以接受的,但要理解未来对该库的更改可能会破坏您的代码(即,如果他们引入了一个新的孩子到没有Key 属性的Equipment

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2011-06-30
    相关资源
    最近更新 更多