Ejemplo n.º 1
0
        /// <summary>Given an arg inst and a value create and activityArgument ready for storage.</summary>
        /// <param name="activity">The <see cref="WfActivity"/> being run. This cannot be null.</param>
        /// <param name="arg">The argument for the activity. This cannot be null.</param>
        /// <param name="value">The value of the argument. Its type is determined by <paramref name="arg"/>. This may be null for certain argument types.</param>
        /// <returns>The converted value.</returns>
        /// <exception cref="ArgumentNullException">Neither <paramref name="activity"/> nor <paramref name="arg"/> can be null.</exception>
        /// <exception cref="ArgumentException"><paramref name="arg"/> must be of a supported type.</exception>
        public static ActivityArgument ConvertArgInstValue(WfActivity activity, ActivityArgument arg, object value)
        {
            if (activity == null)
            {
                throw new ArgumentNullException(nameof(activity));
            }
            if (arg == null)
            {
                throw new ArgumentNullException(nameof(arg));
            }

            ActivityArgument result;

            string name = $"{activity.Name ?? "[Unnamed]"}.{arg.Name ?? "[Unnamed]"}";

            if (arg.Is <ResourceListArgument>())
            {
                var list    = (IEnumerable <IEntity>)value;
                var created = new ResourceListArgument {
                    Name = name
                };
                if (list != null)
                {
                    var cleanList = list.Where(e => e != null).Select(e => e.As <Resource>());
                    created.ResourceListParameterValues.AddRange(cleanList);
                }
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <ResourceArgument>())
            {
                var res     = (IEntity)value;
                var created = new ResourceArgument {
                    Name = name, ResourceParameterValue = res?.As <Resource>()
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <StringArgument>())
            {
                var created = new StringArgument {
                    Name = name, StringParameterValue = (string)value
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <BoolArgument>())
            {
                var created = new BoolArgument {
                    Name = name, BoolParameterValue = (bool?)value ?? false
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <IntegerArgument>())
            {
                var created = new IntegerArgument {
                    Name = name, IntParameterValue = (int?)value ?? 0
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <DecimalArgument>())
            {
                var created = new DecimalArgument {
                    Name = name, DecimalParameterValue = (decimal?)value ?? 0
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <CurrencyArgument>())
            {
                var created = new CurrencyArgument {
                    Name = name, DecimalParameterValue = (decimal?)value ?? 0
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <DateTimeArgument>())
            {
                var created = new DateTimeArgument {
                    Name = name, DateTimeParameterValue = (DateTime?)value
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <DateArgument>())
            {
                var created = new DateArgument {
                    Name = name, DateParameterValue = (DateTime?)value
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <TimeArgument>())
            {
                // ensure that timeparametervalue only ever holds a datetime
                var dt = value is TimeSpan?TimeType.NewTime((TimeSpan)value) : (DateTime?)value;

                var created = new TimeArgument {
                    Name = name, TimeParameterValue = dt
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <GuidArgument>())
            {
                var created = new GuidArgument {
                    Name = name, GuidParameterValue = (Guid?)value ?? Guid.Empty
                };
                result = created.As <ActivityArgument>();
            }
            else
            {
                throw new ArgumentException($"Unsupported ActivityArgument '{arg.IsOfType.First().Name}' in '{name}'", "arg");
            }

            return(result);
        }