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)),
});
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
czy jest szybsza obsada? Tworzę skompilowane settery/pobierające, ale boksowanie z rozpakowywania do obiektu spowalnia wszystko. –
@Demetris następnie: nie używaj zapakowanych danych ... Trudno powiedzieć więcej bez kontekstu –