У меня есть объект ExpandoObject с полем int, и я хочу передать его в десятичное число, используя дерево выражений.Как применить неявное приведение к числовым типам с использованием деревьев выражений?
Вот метод я использую:
private static Expression<Func<dynamic, decimal>> CreateLambdaCastExpression()
{
// source
var sourceParameterExpression = Expression.Parameter(typeof (object), "source");
var binder = Binder.GetMember(
CSharpBinderFlags.None, "IntProp", typeof (ExpressionTreeUtils),
new[] {CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)});
// source.sourceProperty
var sourcePropertyExpression = Expression.Dynamic(
binder, typeof (object), sourceParameterExpression);
// (decimal) source;
var castedValueExpression = Expression.Convert(sourcePropertyExpression, typeof (decimal));
//() => (decimal) source;
return Expression.Lambda<Func<dynamic, decimal>>(castedValueExpression,
sourceParameterExpression);
}
Вызов это таким образом, вызывает InvalidCastException:
dynamic source = new ExpandoObject();
source.IntProp = 1;
decimal r = CreateLambdaCastExpression().Compile()(source);
Если я устанавливаю source.IntProp до 1 м, он работает (очевидно)
Я читал на msdn, что ExpressionConvert выполняет неявное преобразование по пользовательским типам, поэтому это может быть объяснением.
Любая идея о том, как выполнять неявные нажатия на числовые типы?
Не уверен, что я получил это полностью. Но я считаю, что выражение «Expression.Convert» следует «метод реализации« null »как« выражение ». Тип» является ссылочным типом ». Это «объект». Так что, вероятно, если это 'var sourcePropertyExpression = Expression.Dynamic ( binder, typeof (int), sourceParameterExpression);' это поможет. – Artyom