遍历一个本质上是任意类型的List<> 对象
我有一个函数,将 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 进行检查,因为它是最常见的接口,但 ICollection 或 IList 也是可选的替代方案。
if (value is IEnumerable enumerable)
{
foreach (var v in enumerable){
handleArg(v);
}
}
然而,对于使用这类代码要非常小心。你没有类型安全,因此使用这样的代码可能会带来不可预期的行为,编译器也不会提供帮助。它也要求 handleArg 能处理任何类型的对象,包括其他集合,因此需要进一步的类型检查。如果你不想使用类型系统,你可以考虑完全使用 dynamic。
如果列表包含值类型,例如ints或结构体,每个值都会被装箱,导致大量分配,可能会影响性能。
你没有描述你想要做的事情,因此很难给出关于更好替代方案的建议。不过我通常建议尽量减少对反射和 object 的使用。一个更典型的用例是检查一个对象是否是若干已知类型之一,对它们进行处理,并对任何未知类型抛出错误。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。