//---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------- namespace System.Activities.Expressions { using System.Activities.Statements; using System.Collections.Generic; using System.Linq.Expressions; using System.Reflection; using System.Runtime; using System.Collections.ObjectModel; using System.Activities.Validation; static class MemberExpressionHelper { public static void AddOperandArgument(CodeActivityMetadata metadata, InArgument operand, bool isRequired) { RuntimeArgument operandArgument = new RuntimeArgument("Operand", typeof(TOperand), ArgumentDirection.In, isRequired); metadata.Bind(operand, operandArgument); metadata.AddArgument(operandArgument); } public static void AddOperandLocationArgument(CodeActivityMetadata metadata, InOutArgument operandLocation, bool isRequired) { RuntimeArgument operandLocationArgument = new RuntimeArgument("OperandLocation", typeof(TOperand), ArgumentDirection.InOut, isRequired); metadata.Bind(operandLocation, operandLocationArgument); metadata.AddArgument(operandLocationArgument); } public static bool TryGenerateLinqDelegate(string memberName, bool isField, bool isStatic, out Func operation, out ValidationError validationError) { operation = null; validationError = null; try { ParameterExpression operandParameter = Expression.Parameter(typeof(TOperand), "operand"); MemberExpression memberExpression = null; if (isStatic) { memberExpression = Expression.MakeMemberAccess(null, GetMemberInfo(memberName, isField)); } else { memberExpression = Expression.MakeMemberAccess(operandParameter, GetMemberInfo(memberName, isField)); } Expression> lambdaExpression = Expression.Lambda>(memberExpression, operandParameter); operation = lambdaExpression.Compile(); return true; } catch (Exception e) { if (Fx.IsFatal(e)) { throw; } validationError = new ValidationError(e.Message); return false; } } static MemberInfo GetMemberInfo(string memberName, bool isField) { MemberInfo result = null; Type declaringType = typeof(TOperand); if (!isField) { result = declaringType.GetProperty(memberName); } else { result = declaringType.GetField(memberName); } if (result == null) { throw FxTrace.Exception.AsError(new ValidationException(SR.MemberNotFound(memberName, typeof(TOperand).Name))); } return result; } } }