2011-08-05 2 views
3

Je dois passer par la liste. Je ne sais pas à l'avance quel type d'élément Liste contient la liste que je reçois en tant qu'objet.Foreach Liste avec le type d'élément inconnu

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

J'ai besoin de quelque chose qu'il fait comme DropDownList lorsque le processus DataSource. Merci pour votre aide.

+0

Semble comme un bon candidat pour les génériques, pour moi. – Tim

+0

Quelle version de .NET? –

Répondre

5

Vous pouvez essayer ceci:

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

Cependant, si vous appelez effectivement cette méthode avec une liste fortement typé (comme List<YourType>), vous pouvez utiliser les médicaments génériques mieux:

void anyMethod<T>(IEnumerable<T> listData, Func<T, string> callback) 
{ 
    foreach (T item in listData) 
    { 
     string value = callback(item); 
     doSomething(value) 
    } 
}; 

qui est beaucoup nettoyeur.

4

Si DoSomething() est une méthode statique, vous pouvez utiliser une méthode d'extension générique (comme List<T> lui-même est générique de toute façon):

public static void AnyMethod<T>(this List<T> listData, Func<T, string> callback) 
{ 
    foreach (T item in listData) 
    { 
     string value = callback(item); 
     DoSomething(value); 
    } 
} 

Ensuite, appelez comme ceci:

List<MyObject> myList = Something(); 
myList.AnyMethod(obj => obj.Name); 

List<AnotherObject> myList = SomethingAnother(); 
myList.AnyMethod(obj => obj.foo + obj.bar); 

Avis vous pas besoin de jeter non plus. Cependant, si DoSomething() est une méthode d'instance, je pense que vous pouvez utiliser Jamiec's second solution.

+0

+1 pour en faire une méthode d'extension en plus de l'utilisation de génériques. Bien fait :) – Tim

+0

Selon les conventions de nommage .NET, vous devriez aussi utiliser PascalCase pour vos noms de méthodes (comme je le fais dans ma réponse). – BoltClock

+0

@Tim: Merci beaucoup :) – BoltClock