2011-08-05 69 views
3

我需要通過列表。我不知道什麼類型的元素List包含我作爲對象獲取的List。包含未知物品類型的Foreach列表

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) 
... 

我需要他在DropDownList時做的事情,當進程DataSource。 感謝您的幫助。

+0

對我來說,這聽起來像是一個很好的仿製藥候選藥。 – Tim

+0

什麼版本的.NET? –

回答

5

你可以試試這個:

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

這是一個很大清潔器。

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去。

+0

+1使其成爲除了使用泛型之外的擴展方法。做得很好:) – Tim

+0

根據.NET的命名約定,你也應該使用PascalCase作爲你的方法名(正如我在我的回答中所做的那樣)。 – BoltClock

+0

@Tim:非常感謝:) – BoltClock