遍历一个本质上是任意类型的List<> 对象

编程语言 2026-07-09

我有一个函数,将 object 作为参数类型。该参数可以是任意类型,但我需要检查它是否是包含若干预定义类型的List。

如果它是一个列表,我需要遍历该列表,对每个元素逐一执行某些操作(不需要进行强制转换,执行的操作也不关心类型是什么,我只需要遍历,最好不要为每种类型复制粘贴多份代码块:

using System.Collections;

public void myfunc(object value) {
    var isList = value is IList;
    if (isList) {
        foreach (var v in value) {  // this is what I want to do
            handleArg(v); // this function handles object
        }
        /* this is what I don't want to do:
        if (value is List<string>) {
            foreach (var s in values as List<string>) { ... }
        } else if (value is List<int>) {
            foreach(var i in values as List<int>) { ... }
        }
        */
    } else {
        // not a list, just pass this thing on
        handleArg(value)
    }
}

解决方案

可以用 is运算符 对非泛型集合接口之一进行类型检查。我建议对 IEnumerable 进行检查,因为它是最常见的接口,但 ICollectionIList 也是可选的替代方案。

if (value is IEnumerable enumerable)
{
    foreach (var v in enumerable){
        handleArg(v);
    }
}

然而,对于使用这类代码要非常小心。你没有类型安全,因此使用这样的代码可能会带来不可预期的行为,编译器也不会提供帮助。它也要求 handleArg 能处理任何类型的对象,包括其他集合,因此需要进一步的类型检查。如果你不想使用类型系统,你可以考虑完全使用 dynamic

如果列表包含值类型,例如ints或结构体,每个值都会被装箱,导致大量分配,可能会影响性能。

你没有描述你想要做的事情,因此很难给出关于更好替代方案的建议。不过我通常建议尽量减少对反射和 object 的使用。一个更典型的用例是检查一个对象是否是若干已知类型之一,对它们进行处理,并对任何未知类型抛出错误。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章