2014-07-06 18 views
5

Mam następujące wyrażenieCasting wyraz na inny

Expression<Func<T, object>> expr1;

Czy istnieje jakiś sposób, aby rzucić go do

Expression<Func<IUpdateConfiguration<T>, object>>?

[Aktualizacja]

Albo utworzyć nowy Expression<Func<IUpdateConfiguration<T>, object>> z istniejącego Expression<Func<T, object>>?

Odpowiedz

3

Nr Pierwszy to funkcja, która pobiera T i zwraca wartość object. Drugi akceptuje numer IUpdateConfiguration<T> i zwraca wartość object. Jeśli nie jest to T jest również IUpdateConfiguration<T>, nie możesz rzucić tego. Jeśli znasz sposób przekonwertowania numeru IUpdateConfiguration<T> na T, możesz utworzyć wyrażenie nowe,, ale to coś innego niż przesyłanie.

Na przykład, biorąc pod uwagę to:

Expression<Func<IUpdateConfiguration<T>, T> expr2; 

Można dokonać pożądaną funkcję tak:

Expression<Func<IUpdateConfiguration<T>, object>> = 
    (IUpdateConfiguration<T> t) => expr1(expr2(t)); 

Ale to będzie miał zupełnie inny wyraz niż ciało oryginalnego. To może, ale nie musi być problem, w zależności od tego, co próbujesz osiągnąć.

+0

Jak dokładnie funkcja 'expr1' jest funkcją? – Unihedron

+1

@Unihedron: Deklaracją. Dokładniej, jest to wyraz tego typu funkcji. Wyrażenia służą do refleksji nad abstrakcyjnymi drzewami składni i sprawdzania rzeczywistej zawartości wyrażenia. Ale typy wejściowe i wyjściowe są określone w parametrach ogólnych. "T" i "obiekt" odpowiednio. – recursive

+0

Czy mógłbyś wyjaśnić swoje ostatnie rozwiązanie (stworzyć nowe wyrażenie) za pomocą przykładu? – Masoud