如何使用通用方法构建相同类型的列表?

Joh*_*ers 1 c# generics

鉴于:

public static void GetAllTypesInContainer<t>(AContainerWithChildren bw)
{
    var list = new List<t>();       
    var stuff = bw.GetChildren();

    foreach (var child in stuff)
    {
        if (child.GetType().Name == typeOf(t).Name)
        {
            list.Add((t)child);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何将该类型的值添加到列表中?

Wil*_*ill 5

如果我理解了代码,那么你试图让所有类型为t的孩子进入一个列表,并忽略其余的.Linq让事情变得简单.我假设bw.GetChildren()根据你的例子,调用的结果是可枚举的.

using System.Linq;
// ...   

private static List<T> GetAllTypesInContainer<T>(this Container bw)
{
    var list = bw.GetChildren().OfType<T>().ToList();
    return list;
}
Run Code Online (Sandbox Code Playgroud)

或者对于优化的版本,以适应OP所遵循的流畅编码风格,保持上下文与容器:

private static Container ForEachChildOfType<T>(this Container bw, Action<T> action)
{
    var children = bw.GetChildren().OfType<T>().ToList();

    children.Do(action);

    return bw;
}

// later to be used similar as follows as per OP's example

bw
  .StoreInformation()
  .ForEachChildOfType<HtmlHyperLink>(link =>
  {
      if (link.Href == "Something") // caution, watch for mixed case!!!
      {
      }
  })
  .AssertControlTitleOnHomePage();
Run Code Online (Sandbox Code Playgroud)

NB作为一种通用的编码风格,我永远不会调用方法GetXXX,除非它实际返回了一些内容,因此更改了名称.

PS.希望那里没有拼写错误,这一切都来自记忆!