2009-10-21 16 views
8

Ho un metodo generico TResult Foo<TSource, TResult>(IEnumerable<TSource> source) e se TResult è dichiarato come dynamic Voglio eseguire un percorso di codice diverso rispetto ad altre dichiarazioni di tipo.Come posso testare typeof (dinamico)?

Per i tipi regolari che si possono fare cose come:

if (typeof(TResult) == typeof(int)) 
    return ExpressionFactory.CreateExpandoFunction<TSource, TResult>(); 

Ma if (typeof(TResult) == typeof(dynamic)) non viene compilato.

Esiste un modo per fare questo tipo di determinazione in fase di esecuzione quando il metodo viene chiamato con la dichiarazione:

dyanmic x = Foo<int, dynamic>(list); 

Dal dinamica in sé non è un tipo di cosa dovrei prova per? IDynamicMetaObjectProvider?

EDIT Questo fa parte di un testo SQL per System.Linq.Expression valutatore. La precisa volontà di espandersi se TResult è dinamico è per una logica pseudo che sembra qualcosa di simile:

if (type is struct) 
    create selector that initializes each element to result values 
else if (type is class) 
    create selector that initialize each element to new instance and set member properties 
else if (type is dynamic) 
    create selector that initializes each element to new `ExpandoObject` and populates/sets member properties 
+0

Hai bisogno di questo? – Gishu

risposta

10

Semplicemente parlando, non è possibile perché non v'è alcun tipo dinamico. In type dynamic è scritto come oggetto con un attributo speciale allegato (Dynamic) se il tipo appare nei metadati. Sostanzialmente il typeof (dinamico) non è diverso da typeof (oggetto) per la maggior parte degli scopi.

+2

yeah ha appena fatto Debug.Write (typeof (TResult) .FullName ed è in effetti System.Object. – dkackman

1

Non è necessario che l'oggetto dichiarato come dynamic sia un tipo specifico di oggetto. Può essere una sottoclasse di DynamicObject (e quindi fornire una logica specifica per la ricerca delle operazioni), ma può anche essere un oggetto normale (come ha detto @JaredPar).

Forse, se si spiega che tipo di ramo si desidera rendere per gli oggetti dynamic, sarebbe possibile trovare una soluzione migliore.

+0

ha aggiunto qualche chiarimento – dkackman