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

标签 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);
        }
    }
}

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

最佳答案

如果我理解代码,您是在尝试将所有类型为 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;
}

或者对于经过优化以适应 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();

注意,作为一种通用的编码风格,我永远不会调用方法 GetXXX,除非它实际上返回了一些东西,因此名称发生了变化。

附言。希望没有错别字,全凭内存!

关于c# - 如何使用通用方法构建相同类型的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28354950/

相关文章:

C# 嵌入式浏览器忽略 CSS Wordwrap

c# - 在 Visual Studio 2022 (.NET6) 中创建 C# 项目模板

C# MySQL 查询中的所有行都不会进入 datagridview

c# - 我可以在Visual Studio中为单元测试/负载测试创建自定义TestContext计时器吗?

java - int 数组的通用交换方法

c# - 将 BitmapImage 转换为 Image.Source

c++ - 从 C++ 方法返回多种类型?

java.lang.Comparable<T> 无法转换为 T”

c++ - 使用标准 C++ 库 vector 作为底层实现创建一个 Set 模板类

Android 中继承中的 Java 泛型