Est-il possible de remplacer l'utilisation de la méthode ForEach()
par Select()
ou autre chose pour écrire le code suivant dans une chaîne avec des méthodes d'extension imbriquées? OU peut-être existe-t-il d'autres façons d'améliorer l'algorithme?Remplacer ForEach imbriqué avec Sélectionner si applicable
var list = new List<IStatementParser>();
System.IO.Directory.GetFiles(path, "*.dll")
.ForEach(f => System.Reflection.Assembly.LoadFrom(f)
.GetTypes()
.Where(t => !t.IsInterface && typeof(IFoo).IsAssignableFrom(t))
.ForEach(t => list.Add((IFoo)Activator.CreateInstance(t))));
return list.ToDictionary(k => k.Name, v => v.GetType());
Il charge toutes les classes d'ensembles en path
qui implémente IFoo
et les ajoute à Dictionary<string, Type>
où la chaîne est IFoo.Name
Vous avez besoin d'un paramètre foo => foo.GetType() en tant que délégué de la valeur dans l'appel ToDictionary. Sinon, une excellente réponse. –
Je n'ai besoin que de clarifier l'utilisation de 'let' ci-dessus et je suis prêt à accepter votre réponse. Et btw, je n'ai pas besoin de Dictionary, j'ai besoin de Dictionary où Type = IFoo (j'ai édité le post initial) - car ce dictionnaire sera utilisé par FooFactory pour créer une instance de IFoo par demande, cela peut ne pas arriver du tout, dans la session en cours. –
abatishchev
Modifié pour inclure l'appel .GetType(). La clause let dans la réponse de @ Pavel est un truc de style - vous n'avez pas besoin de l'avoir, mais il peut le percevoir comme plus clair. –