2009-10-21 6 views
8

Mam ogólnej metody TResult Foo<TSource, TResult>(IEnumerable<TSource> source) i jeśli TResult jest zadeklarowany jako dynamic Chcę wykonać inną ścieżkę kodu niż dla innych deklaracji typu.Jak wykonać test na typeof (dynamiczny)?

Dla stałych typów można zrobić rzeczy jak:

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

if (typeof(TResult) == typeof(dynamic)) Ale nie skompilować.

Czy mimo to, aby tego rodzaju determinacji przy starcie, gdy wywoływana jest metoda z deklaracją:

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

Ponieważ sam dynamiczny nie jest typem, co mam testować za? IDynamicMetaObjectProvider?

EDYTOWANIE Jest to część tekstu SQL do oceniającego System.Linq.Expression. Specyficzny chęć do oddziału, jeżeli TResult jest dynamiczna jest dla pewnej logiki pseudo, który wygląda mniej więcej tak:

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

Potrzebujesz tego? – Gishu

Odpowiedz

10

Najprościej mówiąc, że nie może, bo nie ma typ dynamiczny. W dynamice typu jest zapisywany jako obiekt z dołączonym specjalnym atrybutem (Dynamic), jeśli typ pojawia się w metadanych. Zasadniczo mówiąc typeof (dynamic) nie różni się od typeof (object) dla większości celów.

+2

tak właśnie zrobił Debug.Write (typeof (TResult) .FullName i rzeczywiście jest System.Object. – dkackman

1

Nie jest konieczne, aby obiekt zadeklarowany jako dynamic był jakimś określonym typem obiektu. Może to być podklasa DynamicObject (i tym samym zapewniać określoną logikę do wyszukiwania operacji), ale może być również normalnym obiektem (jak powiedział @JaredPar).

Może, jeśli wyjaśnisz, jaki rodzaj gałęzi chcesz wykonać dla obiektów dynamic, możliwe byłoby znalezienie lepszego rozwiązania.

+0

dodano trochę wyjaśnienia – dkackman