2015-08-21 48 views
11

ho IEnumerable<Object> e la necessità di passare a un metodo come un parametro, ma questo metodo richiede IReadOnlyCollection<Object>IEnumerable a IReadOnlyCollection

E 'possibile convertire IEnumerable<Object> a IReadOnlyCollection<Object>?

risposta

15

Un modo sarebbe quello di costruire una lista e chiamare AsReadOnly() su di esso:

IReadOnlyCollection<Object> rdOnly = orig.ToList().AsReadOnly(); 

Questo produce ReadOnlyCollection<object>, che implementa IReadOnlyCollection<Object>.

Nota: Dal List<T> attrezzi IReadOnlyCollection<T> così, la chiamata a AsReadOnly() è opzionale. Sebbene sia possibile chiamare il metodo con il risultato di ToList(), preferisco usare AsReadOnly(), in modo che i lettori del mio codice vedano che il metodo che sto chiamando non ha intenzione di modificare la mia lista. Naturalmente potrebbero scoprire la stessa cosa guardando la firma del metodo che sto chiamando, ma è bello essere espliciti al riguardo.

+2

L'elenco implementa anche IReadOnlyCollection, AsReadOnly non è strettamente necessario –

+0

@ScottChamberlain Grazie! Ho modificato per spiegare questo punto. – dasblinkenlight

+0

Grazie per la nota, era un buon punto –

0

In alternativa alla risposta di dasblinkenlight, per evitare che il chiamante colata a Lista <T>, invece di fare orig.ToList().AsReadOnly(), i seguenti potrebbe essere migliore:

ReadOnlyCollection<object> rdOnly = Array.AsReadOnly(orig.ToArray()); 

E 'lo stesso numero di chiamate di metodo, ma uno prende l'altro come parametro invece di essere chiamato sul valore di ritorno.