【问题标题】:Ensure all elements in List<T> types are T确保 List<T> 类型中的所有元素都是 T
【发布时间】:2012-02-08 02:32:54
【问题描述】:

我想验证List&lt;T&gt;的所有元素类型都是T

我可以有一个包含对象、字符串、int、产品、供应商等的List&lt;object&gt;,但在我的情况下,如果List&lt;T&gt; 被定义为List&lt;object&gt;,则所有元素都必须是对象。

也就是说,我要确保元素的类型是传入的泛型类型的确切类型,而不是继承链中的任何其他类型。

例子:

public void Foo<T>(List<T> list)
{
    // if not all elements are of type T (not SubClass of T) throw exception

    //...    
}

最好的方法是什么?

【问题讨论】:

  • 我可能会预先执行此操作并创建一个包含我的对象列表的类。插入后,我会保证添加的类型在批准列表中。
  • 我很好奇为什么当你需要一个整数列表和一个 List 如果你需要一个供应商列表等等时你不会只创建 List 。通过这样做 List 你有点违背泛型的目的,除非你真的想要一个所有这些不同类型的列表。但如果是这样的话,你就不会问我想的问题了。
  • 这种设计是一个非常糟糕的主意 - 在这种情况下,派生类通常应该以与基类相同的方式处理 - 为什么您想要进行此测试?
  • @Etch,我有一种方法可以根据类属性属性制作 Excel 工作表。允许任何类,但不允许两个类,因此 T 和子类 T 不适合一张 excel 表。

标签: c# .net oop generics .net-2.0


【解决方案1】:

假设T 是一个基类,您希望禁止派生类。

if(list.Any(element => element.GetType() != typeof(T))
    throw new ArgumentException();

【讨论】:

  • 我从没想过在这里使用 linq。聪明。
【解决方案2】:

我认为你所追求的是这样的:

public static Boolean AssertNoSubtypes<T>(List<T> items) {
    return items.All(i=>i.GetType().Equals(typeof(T)));
}

【讨论】:

    【解决方案3】:

    您可以使用typeofObject.GetType() 来检查确切的类型。例如:

    foreach(T item in list)
    {
        if(! typeof(T).Equals(item.GetType())
        {
            /* Throw */
        }
    }
    

    【讨论】:

      【解决方案4】:

      我同意 Oded,但如果您想确定或处理每个元素本身,您可以使用 foreach。

      foreach(object item in list)
      {
          //whatever you want
      }
      

      您可以添加随机数量的对象并在此行中放置一个断点,因此您可以自己计算它输入了多少次......或者简单地声明一个计数并检查它是否具有与您添加的相同数量的项目。

      【讨论】:

      • 这没有多大意义。如果列表包含 N 项,则 foreach 循环将执行 N 次或抛出。如果没有异常,foreach 循环迭代的计数和列表项的计数将始终相同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2014-10-25
      • 2022-09-23
      相关资源
      最近更新 更多