private static Expression ApplyBinder(DynamicMetaObjectBinder binder, bool throwException, params Expression[] expressions)
{
var result = binder.Bind(DynamicMetaObject.Create(null, expressions[0]),
expressions.Skip(1).Select(e =>
DynamicMetaObject.Create(null, e)).ToArray()
);
if (result.Expression.NodeType == ExpressionType.Convert)
{
var convert = (UnaryExpression)result.Expression;
return convert.Operand;
}
if (result.Expression.NodeType == ExpressionType.Throw)
{
if (throwException)
{
// throw the exception
Expression.Lambda(result.Expression).Compile().DynamicInvoke();
}
else return null;
}
return result.Expression;
}