2009-10-21 18 views
8

Tengo un método genérico TResult Foo<TSource, TResult>(IEnumerable<TSource> source) y si TResult está declarado como dynamic, quiero ejecutar una ruta de código diferente a la de otras declaraciones de tipos.¿Cómo pruebo para typeof (dinámico)?

Para los tipos regulares que se pueden hacer cosas como:

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

Pero if (typeof(TResult) == typeof(dynamic)) no compila.

¿Hay alguna forma de hacer este tipo de determinación en tiempo de ejecución cuando se llama al método con la declaración:

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

Desde dinámica en sí misma no es un tipo de lo que debería estar probando para? IDynamicMetaObjectProvider?

EDIT Esto es parte de un texto SQL para System.Linq.Expression evaluator. El deseo específico para ramificar si TResult es dinámico es para algunos seudo lógica que se ve algo como esto:

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

¿Necesita esto? – Gishu

Respuesta

10

En pocas palabras no se puede porque no hay ningún tipo dinámico. En tipo dinámico se escribe como un objeto con un atributo especial adjunto (dinámico) si el tipo aparece en los metadatos. Esencialmente, decir typeof (dinámico) no es diferente de typeof (object) para la mayoría de los propósitos.

+2

Sí, acabo de hacer Debug.Write (typeof (TResult) .FullName y de hecho es System.Object. – dkackman

1

No es necesario que el objeto declarado como dynamic sea un tipo específico de objeto. Puede ser una subclase de DynamicObject (y así proporcionar una lógica específica para la búsqueda de operaciones), pero también puede ser un objeto normal (como dijo @JaredPar).

Quizás, si explica qué tipo de rama desea hacer para los objetos dynamic, sería posible encontrar una mejor solución.

+0

agregó alguna aclaración – dkackman