具有未知项目类型的Foreach列表

时间:2011-08-05 07:52:32

标签: c#

我需要浏览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)
...

当进程DataSource时,我需要他作为DropDownList做的事情。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:6)

你可以试试这个:

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

这很干净。

答案 1 :(得分:4)

如果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's second solution