2009-10-21 7 views
8

Ich habe eine generische Methode TResult Foo<TSource, TResult>(IEnumerable<TSource> source) und wenn TResult als dynamic deklariert ist, möchte ich einen anderen Code-Pfad als für andere Typ-Deklarationen ausführen.Wie teste ich auf typeof (dynamisch)?

Für normale Typen, die Sie Sachen tun können, wie:

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

Aber if (typeof(TResult) == typeof(dynamic)) lässt sich nicht kompilieren.

Gibt es trotzdem, diese Art der Bestimmung zur Laufzeit zu machen, wenn das Verfahren mit der Erklärung genannt wird:

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

Da die dynamische selbst ist kein Typ, was soll ich für testen? IDynamicMetaObjectProvider?

BEARBEITEN Dies ist Teil eines SQL-Text zu System.Linq.Expression Evaluator. Die spezifische Wunsch zu verzweigen, wenn TResult dynamisch ist für einige Pseudo-Logik, die etwa wie folgt aussieht:

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

Benötigen Sie das? – Gishu

Antwort

10

Einfach gesagt kann man nicht, weil es keine Art dynamisch. Im Typ dynamic wird als Objekt mit einem speziellen Attribut (Dynamic) angehängt, wenn der Typ in Metadaten erscheint. Im wesentlichen sagt typeof (dynamisch) für die meisten Zwecke nicht anders als typeof (object).

+2

yeah hat gerade Debug.Write (typeof (TResult) .FullName und es ist in der Tat System.Object. – dkackman

1

Es ist nicht erforderlich, dass das Objekt dynamic ein bestimmter Objekttyp ist. Es kann eine Unterklasse von DynamicObject sein (und somit eine spezifische Logik für Operationen bereitstellen), aber es kann auch ein normales Objekt sein (wie @JaredPar sagte).

Vielleicht, wenn Sie erklären, welche Art von Zweig Sie für dynamic Objekte machen möchten, wäre es möglich, bessere Lösung zu finden.

+0

hinzugefügt einige Klarstellungen – dkackman