public List <ArgumentAccessorWrapper> GetArgumentAccessorWrappers(Activity activity) { Fx.Assert(activity != null, "activity cannot be null."); List <ArgumentAccessorWrapper> argumentAccessorWrappers = null; if (!this.argumentAccessorWrappersCache.TryGetValue(activity, out argumentAccessorWrappers)) { Func <Activity, IEnumerable <ArgumentAccessor> > argumentAccessorsGenerator; if (ActivityArgumentHelper.TryGetArgumentAccessorsGenerator(activity.GetType(), out argumentAccessorsGenerator)) { IEnumerable <ArgumentAccessor> argumentAccessors = argumentAccessorsGenerator(activity); if (argumentAccessors != null) { argumentAccessorWrappers = new List <ArgumentAccessorWrapper>(); foreach (ArgumentAccessor argumentAccessor in argumentAccessors) { if (argumentAccessor != null && argumentAccessor.Getter != null) { Argument argument = argumentAccessor.Getter(activity); if (argument != null) { ArgumentAccessorWrapper argumentAccessorWrapper = new ArgumentAccessorWrapper(argumentAccessor, argument); argumentAccessorWrappers.Add(argumentAccessorWrapper); } } } this.argumentAccessorWrappersCache.Add(activity, argumentAccessorWrappers); } } } return(argumentAccessorWrappers); }
internal static ExpressionReplacement ComputeExpressionReplacement(ActivityWithResult expression, Activity parentActivity, EditingContext context, ArgumentAccessorWrapperCache argumentAccessorWrapperCache, Type preferredReturnType = null) { Fx.Assert(expression != null, "expressions cannot be null."); Fx.Assert(parentActivity != null, "parentActivity cannot be null."); Fx.Assert(context != null, "context cannot be null."); Fx.Assert(argumentAccessorWrapperCache != null, "argumentAccessorWrapperCache cannot be null."); IEnumerable <ArgumentAccessorWrapper> argumentAccessorWrappers = argumentAccessorWrapperCache.GetArgumentAccessorWrappers(parentActivity); if (argumentAccessorWrappers != null) { ArgumentAccessorWrapper argumentAccessorWrapper = argumentAccessorWrappers.FirstOrDefault(wrapper => object.ReferenceEquals(wrapper.Argument.Expression, expression)); if (argumentAccessorWrapper != null) { bool isLocationExpression = ExpressionHelper.IsGenericLocationExpressionType(expression); bool canInferType = true; Type expectedReturnType; ActivityWithResult morphedExpression; if (preferredReturnType != null) { expectedReturnType = preferredReturnType; } else { canInferType = ExpressionHelper.TryInferReturnType(expression, context, out expectedReturnType); } if (canInferType && expectedReturnType != null && ExpressionHelper.TryMorphExpression(expression, isLocationExpression, expectedReturnType, context, out morphedExpression)) { Type expressionResultType = isLocationExpression ? expression.ResultType.GetGenericArguments()[0] : expression.ResultType; if (expressionResultType != expectedReturnType) { Argument newArgument = Argument.Create(expectedReturnType, argumentAccessorWrapper.Argument.Direction); newArgument.Expression = morphedExpression; return(new ExpressionReplacement(expression, argumentAccessorWrapper.Argument, newArgument, argumentAccessorWrapper.ArgumentAccessor)); } } } } return(null); }
public List<ArgumentAccessorWrapper> GetArgumentAccessorWrappers(Activity activity) { Fx.Assert(activity != null, "activity cannot be null."); List<ArgumentAccessorWrapper> argumentAccessorWrappers = null; if (!this.argumentAccessorWrappersCache.TryGetValue(activity, out argumentAccessorWrappers)) { Func<Activity, IEnumerable<ArgumentAccessor>> argumentAccessorsGenerator; if (ActivityArgumentHelper.TryGetArgumentAccessorsGenerator(activity.GetType(), out argumentAccessorsGenerator)) { IEnumerable<ArgumentAccessor> argumentAccessors = argumentAccessorsGenerator(activity); if (argumentAccessors != null) { argumentAccessorWrappers = new List<ArgumentAccessorWrapper>(); foreach (ArgumentAccessor argumentAccessor in argumentAccessors) { if (argumentAccessor != null && argumentAccessor.Getter != null) { Argument argument = argumentAccessor.Getter(activity); if (argument != null) { ArgumentAccessorWrapper argumentAccessorWrapper = new ArgumentAccessorWrapper(argumentAccessor, argument); argumentAccessorWrappers.Add(argumentAccessorWrapper); } } } this.argumentAccessorWrappersCache.Add(activity, argumentAccessorWrappers); } } } return argumentAccessorWrappers; }