2009-10-21 6 views
8

J'ai une méthode générique TResult Foo<TSource, TResult>(IEnumerable<TSource> source) et si TResult est déclaré comme dynamic Je veux exécuter un chemin de code différent que pour les autres déclarations de type.Comment puis-je tester pour typeof (dynamique)?

Pour les types réguliers que vous pouvez faire des choses comme:

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

Mais if (typeof(TResult) == typeof(dynamic)) ne compile pas.

est-il de toute façon de faire ce genre de détermination lors de l'exécution lorsque la méthode est appelée avec la déclaration:

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

Depuis elle-même dynamique n'est pas un type que dois-je testerai pour? IDynamicMetaObjectProvider?

EDIT Cela fait partie d'un évaluateur SQL System.Linq.Expression. Le désir spécifique à la branche si TResult est dynamique pour une logique pseudo qui ressemble à ceci:

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

Besoin de ça? – Gishu

Répondre

10

simplement vous ne pouvez pas parler parce qu'il n'y a pas de dynamique de type. Dans type dynamic est écrit en tant qu'objet avec un attribut spécial attaché (Dynamic) si le type apparaît dans les métadonnées. Essentiellement, dire typeof (dynamique) n'est pas différent de typeof (objet) dans la plupart des cas.

+2

ouais juste fait Debug.Write (typeof (TResult) .FullName et il est en effet System.Object. – dkackman

1

Il n'est pas nécessaire que l'objet déclaré dynamic soit un type d'objet spécifique. Il peut s'agir d'une sous-classe de DynamicObject (et donc fournir une logique spécifique pour la recherche d'opérations), mais il peut aussi s'agir d'un objet normal (comme dit @JaredPar). Peut-être, si vous expliquez quel genre de branche vous voulez faire pour les objets dynamic, il serait possible de trouver une meilleure solution.

+0

ajouté quelques clarifications – dkackman