2014-05-14 19 views
5

Ho un List<dynamic> e ho bisogno di passare i valori e il tipo dell'elenco a un servizio. Il codice di servizio sarebbe qualcosa di simile:Come ottenere il tipo di un oggetto dinamico in C#?

Type type = typeof(IList<>); 
// Type genericType = how to get type of list. Such as List<**string**>, List<**dynamic**>, List<**CustomClass**> 
// Then I convert data value of list to specified type. 
IList data = (IList)JsonConvert.DeserializeObject(this._dataSourceValues[i], genericType); 

_dataSourceValues: valori nell'elenco

Come posso gettato il tipo di lista per un particolare tipo se il tipo di elenco è dinamico (List<dynamic>) ?

+0

[Fa questa risposta di aiuto?] (Http://stackoverflow.com/a/557349/61470) – DaveParsons

+1

Se non si conosce il tipo in fase di compilazione non si può. (A meno che non si utilizza riflessione –

+0

Non è possibile eseguire il cast su un oggetto tipizzato staticamente, anche usando il reflection. –

risposta

1

Se ho capito bene, si dispone di un List<dynamic> e si desidera creare un elenco con il tipo di runtime appropriato dell'oggetto dinamico?

Sarebbe qualcosa di simile a questo aiuto:

private void x(List<dynamic> dynamicList) 
{ 
    Type typeInArgument = dynamicList.GetType().GenericTypeArguments[0]; 
    Type newGenericType = typeof(List<>).MakeGenericType(typeInArgument); 
    IList data = (IList)JsonConvert.DeserializeObject(this._dataSourceValues[i], newGenericType); 
} 

In un'altra nota, penso che si dovrebbe ripensare il design del codice. Non ho abbastanza contesto, ma sono curioso di sapere perché stai usando la dinamica qui. Avere un List<dynamic> significa in pratica che non ti interessa quale sia il tipo della lista in arrivo. Se ti interessa veramente il tipo (sembra che tu faccia come stai facendo la serializzazione) forse non dovresti usare la dinamica.

+0

Grazie per la risposta. Capisco, dinamico è un tipo di oggetto (quando uso il metodo get type). Informazioni sul codice di ripensamento: ho il servizio per eseguire il rendering del report, quindi devo passare tutte le risorse ad esso, in stringa, ed è per questo che utilizzo il codice precedente. Non posso dire chiaramente perché il requisito del lavoro. –

1
private void x(List<dynamic> dynamicList) 
      { 
       Type typeInArgument = dynamicList.GetType(); 
       Type newGenericType = typeof(List<>).MakeGenericType(typeInArgument); 
       IList data = (IList)JsonConvert.DeserializeObject(this._dataSourceValues[i], newGenericType); 
      } 
Problemi correlati