Exemplo n.º 1
0
        private ActivityParameterEvaluator GetParameterEvaluator( 
            Activity activity, ActivityParameter param, string paramValue)
        {
            if (paramValue.StartsWith("@"))
            {
                paramValue = paramValue.Substring(1);
                if (string.IsNullOrEmpty(paramValue))
                    throw new WorkflowSchemeParserException(string.Format(
                        "Некорректное значение параметра {0}: {1}", param.Name, paramValue), this);
                if (paramValue.StartsWith("@"))
                {
                    paramValue = paramValue.Substring(1);
                    if (string.IsNullOrEmpty(paramValue))
                        throw new WorkflowSchemeParserException(string.Format(
                            "Некорректное значение параметра {0}: {1}", param.Name, paramValue), this);
                    try
                    {
                        return WorkflowBuiltinFunctions.GetEvaluatorForBuiltinFunction(paramValue);
                    }
                    catch (Exception ex)
                    {
                        throw new WorkflowSchemeParserException(
                            "Ошибка получения метода для получения значения параметра", ex, this);
                    }
                }
                int dotIndex = paramValue.IndexOf(PREFIX_DELIMITER);
                if (dotIndex > 0)
                {
                    var strArr = paramValue.Split(PREFIX_DELIMITER);
                    var prefix = strArr[0];
                    var propName = strArr[1];
                    if (string.IsNullOrEmpty(propName))
                        throw new WorkflowSchemeParserException(string.Format(
                            "Некорректное значение параметра {0}: {1}", param.Name, paramValue), this);
                    if (prefix == PREFIX_ROOT)
                        prefix = Scheme.RootActivityName;
                    var propOwner = GetReferencedActivity(prefix);
                    return GetParameterEvaluatorForPropertyReference(propName, propOwner);
                }
                if (activity.Parent == null)
                    throw new WorkflowSchemeParserException(string.Format(
                        "Для значения-ссылки @{0} параметра {1} не определено родительское действие",
                        paramValue, param.Name), this);

                return GetParameterEvaluatorForPropertyReference(paramValue, activity.Parent);
            }
            if (paramValue.StartsWith("[") && paramValue.EndsWith("]"))
            {
                paramValue = paramValue.Substring(1, paramValue.Length - 2);
                var array = paramValue.Split(',');
                var evaluatorArray = new ActivityParameterEvaluator[array.Length];
                for (int i = 0; i < array.Length; i++)
                    evaluatorArray[i] = GetParameterEvaluator(activity, param, array[i]);
                return new ActivityParameterEvaluator(evaluatorArray);
            }
            if (paramValue.StartsWith(@"\@"))
                paramValue = '@' + paramValue.Substring(2);
            return new ActivityParameterEvaluator(paramValue);
        }
Exemplo n.º 2
0
 private ActivityParameterEvaluator EvaluateParameterEvaluator(ActivityParameterEvaluator evaluator)
 {
     if (evaluator.ValueType == ActivityParameterValueType.Array)
     {
         for (int i = 0; i < evaluator.EvaluatorArray.Length; i++)
             evaluator.EvaluatorArray[i] = EvaluateParameterEvaluator(evaluator.EvaluatorArray[i]);
         return evaluator;
     }
     var unevalEvaluator = evaluator as UnevaluatedActivityParameterEvaluator;
     if (unevalEvaluator == null)
         return evaluator;
     return CreateActivityParameterEvaluator(
         unevalEvaluator.PropertyName,
         EvaluateActivity(
             unevalEvaluator.PropertyOwner,
             string.Format("Вычисление действия, содержащего св-во {0}", unevalEvaluator.PropertyName)));
 }