public override object GetParameterValue(ParameterType parameter)
        {
            var reflectionData = CommandReflection.GetReflectionData(this.GetType());
            var propInfo       = reflectionData.MappedProperties[parameter];
            var type           = propInfo.PropertyType;

            if (type.Equals(typeof(bool)))
            {
                return(null);
            }
            else if (type.IsEnum)
            {
                return((decimal)(int)propInfo.GetValue(this, null));
            }
            else if (type.IsGenericType && type.GetGenericArguments()[0].IsEnum)
            {
                var val = propInfo.GetValue(this, null);
                if (val == null)
                {
                    return(null);
                }
                return((decimal)(int)val);
            }
            else
            {
                var val = propInfo.GetValue(this, null);
                if (val == null)
                {
                    return(null);
                }
                var dec = (decimal)Convert.ChangeType(val, typeof(decimal));
                return(dec);
            }
        }
        public override IEnumerable <ParameterType> GetParameters()
        {
            var reflectionData = CommandReflection.GetReflectionData(this.GetType());

            foreach (var kv in reflectionData.MappedProperties)
            {
                var paramType = kv.Key;
                var propInfo  = kv.Value;

                if (propInfo.PropertyType.Equals(typeof(bool)) && (bool)propInfo.GetValue(this, null) == true)
                {
                    yield return(paramType);
                }
                else if (GetParameterValue(paramType) != null)
                {
                    yield return(paramType);
                }
            }
        }
        public override void SetParameterValue(ParameterType parameter, object value)
        {
            var reflectionData = CommandReflection.GetReflectionData(this.GetType());
            var propInfo       = reflectionData.MappedProperties[parameter];

            var  type           = propInfo.PropertyType;
            bool isNullableType = type.Equals(typeof(string)) || (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable <>));

            if (type.Equals(typeof(bool)) || type.Equals(typeof(bool?)))
            {
                propInfo.SetValue(this, true, null);
            }
            else if (value == null)
            {
                if (isNullableType)
                {
                    propInfo.SetValue(this, null, null);
                }
                else if (type.IsEnum)
                {
                    propInfo.SetValue(this, 0, null);
                }
                else
                {
                    propInfo.SetValue(this, Convert.ChangeType(0, type), null);
                }
            }
            else if (value != null)
            {
                if (type.Equals(typeof(string)))
                {
                    propInfo.SetValue(this, value, null);
                }
                else if (type.Equals(typeof(byte)) || type.Equals(typeof(byte?)))
                {
                    propInfo.SetValue(this, Convert.ChangeType(value, typeof(byte)), null);
                }
                else if (type.Equals(typeof(int)) || type.Equals(typeof(int?)))
                {
                    propInfo.SetValue(this, Convert.ChangeType(value, typeof(int)), null);
                }
                else if (propInfo.PropertyType.Equals(typeof(double)) || propInfo.PropertyType.Equals(typeof(double?)))
                {
                    propInfo.SetValue(this, Convert.ChangeType(value, typeof(double)), null);
                }
                else if (propInfo.PropertyType.Equals(typeof(decimal)) || propInfo.PropertyType.Equals(typeof(decimal?)))
                {
                    propInfo.SetValue(this, Convert.ChangeType(value, typeof(decimal)), null);
                }
                else if (type.IsEnum)
                {
                    var enumVal = Enum.ToObject(type, Convert.ChangeType(value, typeof(int)));
                    propInfo.SetValue(this, enumVal, null);
                }
                else if (type.IsGenericType && type.GetGenericArguments()[0].IsEnum)
                {
                    var enumVal = Enum.ToObject(type.GetGenericArguments()[0], Convert.ChangeType(value, typeof(int)));
                    propInfo.SetValue(this, enumVal, null);
                }
                else
                {
                    throw new Exception("Command property type not supported: " + type);
                }
            }
        }
        public override bool HasParameter(ParameterType parameter)
        {
            var reflectionData = CommandReflection.GetReflectionData(this.GetType());

            return(reflectionData.MappedProperties.ContainsKey(parameter));
        }