2015-12-09 16 views
16

Sto cercando di ottenere List di stringhe dalla mia lista oggetto dinamico e si continua a dire che:C# dinamica selezionare lista di stringhe

di errore 1 Impossibile convertire implicitamente il tipo 'System.Collections.Generic.List<dynamic>' a 'System.Collections.Generic.List<string>'

che sto selezionando una proprietà e utilizzare .ToString() su di esso:

var objects = new List<dynamic>(); 
//filling objects here 

List<string> things = objects.Select(x => x.nameref.ToString()).ToList(); 

Quindi non è un valido elenco di stringhe? Perché il compilatore presuppone che questa lista sia di tipo dynamic?

Ho provato anche a convertire da this risposta, ma continua a darmi lo stesso errore.

Qualcuno sa come farlo List<string>?

EDIT:

Perché non funziona? Poiché è possibile effettuare pasticcio come questo:

public class Test 
{ 
    public int ToString() 
    { 
     return 0; 
    } 
} 

e compilatore non so se ToString rendimenti string o int.

risposta

18

È necessario lanciare gli oggetti, in questo modo:

List<string> things = objects.Select(x => x.nameref.ToString()).Cast<string>().ToList(); 

Il motivo per cui non riconosce che ToString() restituisce una stringa è che è chiamato su un dynamic e il binding del metodo viene eseguito in fase di runtime, non in fase di compilazione.

+3

Grandi, grazie per la spiegazione :) – wudzik

+1

@wudzik Felice di aiutare, amico :) – Rob

+1

Ho modificato la mia domanda per aggiungere esempio perché non funziona ispirato alla tua risposta :) – wudzik

5

Si potrebbe provare a utilizzare Fusioni, in questo modo:

List<string> things = objects.Select(x => x.nameref).Cast<string>().ToList(); 

Si potrebbe anche provare a lanciare nel Select sé:

List<string> things = objects.Select(x => x.nameref as string).ToList(); 
2

A mio parere, la conversione allo List<string> desiderato può essere eseguita come segue.

var objects = new List<dynamic>(); 

// filling objects here 

List<string> things = objects.Select(x => x.nameref.ToString()).Cast<string>.ToList(); 
7

Anche se la risposta accettata funziona bene, mi permetta di suggerire un'alternativa: Fusioni nameref per il tipo corretto (sostituire (object) da un cast più specifica, se vi capita di conoscere il tipo di nameref):

List<string> things = objects.Select(x => ((object)x.nameref).ToString()).ToList(); 

Il vantaggio di questa soluzione è che ToString viene risolto staticamente. Così, la chiamata al metodo è

  • garantito per tornare string, dal momento che il compilatore sa che si sta chiamando Object.ToString() (o una variante di override dello stesso) e

  • più veloce e pulito.Questa soluzione mantiene la risoluzione dinamica al minimo necessario (ovvero la risoluzione di x.nameref). Gli errori di battitura nella chiamata a ToString vengono catturati dal compilatore.

(Naturalmente, se il tipo di nameref sembra essere stringa, si può solo cadere la chiamata alla ToString(), rendendo il vostro codice, anche più pulito e più breve.)

+0

Ottima risposta, grazie! Proverò questo approccio. – wudzik

Problemi correlati