2011-08-24 23 views
8

enter image description hereChe cosa sta effettivamente facendo questo snippet di ReSharper "converti in gruppo di metodi"?

codice prima che le modifiche:

List<ProductBrandModel> model = brands.Select(item => Mapper.Map<ProductBrand, ProductBrandModel>(item)).ToList(); 

codice dopo il miglioramento:

List<ProductBrandModel> model = brands.Select(Mapper.Map<ProductBrand, ProductBrandModel>).ToList(); 

Cos'è questo facendo? Esegue implicitamente tale mappatura su ogni elemento della collezione brands?

+0

Ho anche affrontato lo stesso problema con il mio codice qui sotto, mentre la comprensione TPL: 'ParallelForEach private static void() { Parallel.Invoke (() => Metodo 1(), () => Method2 ()); } static void Method1 privato() { // fare un certo lavoro } static void Method2 privato() { // fare un certo lavoro } ' – RBT

risposta

10

Poiché si passa direttamente il parametro dell'espressione lambda al metodo Mapper.Map, è esattamente equivalente alla specifica di questo metodo direttamente come proiezione per Select. La firma di Mapper.Map è compatibile con il delegato Func<TSource, TResult>, pertanto R # suggerisce di utilizzare direttamente il gruppo metodo anziché un'espressione lambda.

+0

Hai tre upvotes ma ho altre domande . :) Capisco che la firma sia ma cosa viene proiettato quando utilizzo il codice migliorato? Il .Select riorganizza ogni oggetto 'ProductBrand' e Mapper.Map presuppone che il bit sia il TSource? –

+1

Bene, 'TSource' è già noto, poiché' brands' è una raccolta di 'ProductBrand'. Il compilatore deduce 'TResult' dal tipo di ritorno di' Mapper.Map'. –

3

La prima riga crea un metodo che chiama immediatamente la funzione Mapper.Map. Questo non è necessario poiché il metodo Mapper.Map corrisponde alla definizione prevista di Select e può richiamare direttamente Mapper.Map. Il resharper lo modifica in modo che venga chiamato solo 1 metodo e il metodo extra non viene generato dal compilatore.

Problemi correlati