2011-06-27 20 views
11

Używam wyrażenia, aby utworzyć trochę dynamicznie generowanego kodu. Moje rozwiązanie działa, z wyjątkiem jednej funkcji: Chcę wykonać zaznaczoną rzutnię, w której wyjątek TypeCastException jest generowany, jeśli rzutowanie zakończy się niepowodzeniem.Zaznaczone rzutowanie w drzewie wyrażeń?

Znalazłem Expression.TypeAs(), który wykonuje konwersję typu, ale zwraca wartość null, zamiast rzucać, gdy rzut się nie powiedzie.

Czy istnieje prosty sposób na sprawdzenie zaznaczonego typu w wyrażeniu? Czy muszę sprawdzić wartość zerową i sam wyrzucić wyjątek?

Oto co mam: -

ParameterExpression typedAttribute = Expression.Variable(attributeType, "typedAttribute"); 
ParameterExpression typedValue = Expression.Variable(valueType, "typedValue"); 

BlockExpression methodBlock = Expression.Block(new[] { typedAttribute, typedValue }, new Expression[] 
    { 
     Expression.Assign(typedAttribute, Expression.TypeAs(attribute, attributeType)), 
     Expression.Assign(typedValue, Expression.TypeAs(value, valueType)), 
     Expression.Call(visitor, methodInfo, typedAttribute, typedValue), 
     Expression.Assign(visited, Expression.Constant(true)), 
    }); 

Odpowiedz

12

Expression.Convert powinien działać jako obsadzie tutaj.

+1

Dzięki, że działa. Właściwie pamiętam wcześniej, próbując Expression.Convert(), ale myślę, że miałem inny błąd w moim kodzie w tym czasie, co uniemożliwiło mi stwierdzenie, że to było poprawne rozwiązanie. W każdym razie świetnie jest mieć tak ostateczną odpowiedź! – PeteAC

+0

czy jest szybsza obsada? Tworzę skompilowane settery/pobierające, ale boksowanie z rozpakowywania do obiektu spowalnia wszystko. –

+1

@Demetris następnie: nie używaj zapakowanych danych ... Trudno powiedzieć więcej bez kontekstu –

Powiązane problemy