具有未知项类型的Foreach List
本文关键字:Foreach List 类型 未知 | 更新日期: 2023-09-27 18:04:30
我需要遍历List。我事先不知道List元素包含什么类型的List作为对象。
void anyMethod(object listData, Func<object, string> callback)
{
foreach (object item in (List<object>)data)
{
string value = callback(item);
doSomething(value)
}
};
...
List<MyObject> myList = something();
anyMethod(myList, obj => (MyObject)obj.Name)
...
List<AnotherObject> myList = somethingAnother();
anyMethod(myList, obj => (AnotherObject)obj.foo + (AnotherObject)obj.bar)
...
我需要一些他做下拉列表时,处理数据源。谢谢你的帮助。
你可以试试:
void anyMethod(object listData, Func<object, string> callback)
{
IEnumerable enumerable = listData as IEnumerable;
if(enumerable == null)
throw new InvalidOperationException("listData mist be enumerable");
foreach (object item in enumerable.OfType<object>())
{
string value = callback(item);
doSomething(value)
}
};
但是,如果您实际使用强类型列表(例如List<YourType>
)调用此方法,则可以更好地使用泛型:
void anyMethod<T>(IEnumerable<T> listData, Func<T, string> callback)
{
foreach (T item in listData)
{
string value = callback(item);
doSomething(value)
}
};
更简洁。
如果DoSomething()
是静态方法,则可以使用泛型扩展方法(因为List<T>
本身就是泛型方法):
public static void AnyMethod<T>(this List<T> listData, Func<T, string> callback)
{
foreach (T item in listData)
{
string value = callback(item);
DoSomething(value);
}
}
然后像这样调用它:
List<MyObject> myList = Something();
myList.AnyMethod(obj => obj.Name);
List<AnotherObject> myList = SomethingAnother();
myList.AnyMethod(obj => obj.foo + obj.bar);
注意两者都不需要强制转换。
但是,如果DoSomething()
是一个实例方法,我认为您可以使用Jamiec的第二个解决方案。