//---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------- namespace System.Activities.Expressions { using System.Activities.Validation; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq.Expressions; using System.Runtime; static class BinaryExpressionHelper { public static void OnGetArguments(CodeActivityMetadata metadata, InArgument left, InArgument right) { RuntimeArgument rightArgument = new RuntimeArgument("Right", typeof(TRight), ArgumentDirection.In, true); metadata.Bind(right, rightArgument); RuntimeArgument leftArgument = new RuntimeArgument("Left", typeof(TLeft), ArgumentDirection.In, true); metadata.Bind(left, leftArgument); metadata.SetArgumentsCollection( new Collection { rightArgument, leftArgument }); } public static bool TryGenerateLinqDelegate(ExpressionType operatorType, out Func function, out ValidationError validationError) { function = null; validationError = null; ParameterExpression leftParameter = Expression.Parameter(typeof(TLeft), "left"); ParameterExpression rightParameter = Expression.Parameter(typeof(TRight), "right"); try { BinaryExpression binaryExpression = Expression.MakeBinary(operatorType, leftParameter, rightParameter); Expression expressionToCompile = OperatorPermissionHelper.InjectReflectionPermissionIfNecessary(binaryExpression.Method, binaryExpression); Expression> lambdaExpression = Expression.Lambda>(expressionToCompile, leftParameter, rightParameter); function = lambdaExpression.Compile(); return true; } catch (Exception e) { if (Fx.IsFatal(e)) { throw; } validationError = new ValidationError(e.Message); return false; } } } }