Пример #1
0
        /// <summary>
        /// 返回指定类型的对象,其值等效于指定字符串对象。
        /// </summary>
        /// <param name="context"> </param>
        /// <param name="input"> 需要转换类型的字符串对象 </param>
        /// <param name="outputType"> 换转后的类型 </param>
        /// <param name="success"> 是否成功 </param>
        protected override IDictionary <K, V> ChangeType(ConvertContext context, string input, Type outputType,
                                                         out bool success)
        {
            input = input?.Trim() ?? "";
            if (input.Length == 0)
            {
                var keyConvertor   = context.Get <K>();
                var valueConvertor = context.Get <V>();

                var builder = new DictionaryBuilder(context, outputType, keyConvertor, valueConvertor);
                // ReSharper disable once AssignmentInConditionalExpression
                return((success = builder.TryCreateInstance()) ? builder.Instance : null);
            }
            if (input?.Length > 2)
            {
                if ((input[0] == '{') && (input[input.Length - 1] == '}'))
                {
                    try
                    {
                        var result = ComponentServices.ToJsonObject(outputType, input);
                        success = true;
                        return((IDictionary <K, V>)result);
                    }
                    catch (Exception ex)
                    {
                        context.AddException(ex);
                    }
                }
            }
            success = false;
            return(null);
        }
Пример #2
0
 /// <summary>
 /// 初始化构造器
 /// </summary>
 /// <param name="context"> 转换上下文 </param>
 /// <param name="type"> 需要构造的实例类型 </param>
 public ListBuilder(ConvertContext context, Type type)
 {
     _context   = context;
     _type      = type;
     _convertor = context.Get <T>();
     Instance   = null;
 }
Пример #3
0
            public bool Add(object key, object value)
            {
                var  conv = _context.Get <string>();
                bool b;
                var  skey = conv.ChangeType(_context, key, typeof(string), out b);

                if (b == false)
                {
                    return(false);
                }
                var svalue = conv.ChangeType(_context, value, typeof(string), out b);

                if (b == false)
                {
                    return(false);
                }
                try
                {
                    Instance.Add(skey, svalue);
                    return(true);
                }
                catch (Exception ex)
                {
                    _context.AddException(ex);
                    return(false);
                }
            }
Пример #4
0
        /// <summary>
        /// 返回指定类型的对象,其值等效于指定对象。
        /// </summary>
        /// <param name="context"> </param>
        /// <param name="input"> 需要转换类型的对象 </param>
        /// <param name="outputType"> 换转后的类型 </param>
        /// <param name="success"> 是否成功 </param>
        protected override UIntPtr ChangeTypeImpl(ConvertContext context, object input, Type outputType,
                                                  out bool success)
        {
            var num = context.Get <ulong>().ChangeType(context, input, typeof(ulong), out success);

            return(success ? new UIntPtr(num) : default(UIntPtr));
        }
Пример #5
0
        /// <summary>
        /// 返回指定类型的对象,其值等效于指定字符串对象。
        /// </summary>
        /// <param name="context"> </param>
        /// <param name="input"> 需要转换类型的字符串对象 </param>
        /// <param name="outputType"> 换转后的类型 </param>
        /// <param name="success"> 是否成功 </param>
        protected override T?ChangeType(ConvertContext context, string input, Type outputType, out bool success)
        {
            if (string.IsNullOrWhiteSpace(input))
            {
                success = true;
                return(null);
            }
            var conv = context.Get <T>();

            return(conv.ChangeType(context, input, conv.OutputType, out success));
        }
Пример #6
0
        /// <summary>
        /// 返回指定类型的对象,其值等效于指定对象。
        /// </summary>
        /// <param name="context"> </param>
        /// <param name="input"> 需要转换类型的对象 </param>
        /// <param name="outputType"> 换转后的类型 </param>
        /// <param name="success"> 是否成功 </param>
        /// <returns> </returns>
        protected override IDictionary <K, V> ChangeTypeImpl(ConvertContext context, object input, Type outputType,
                                                             out bool success)
        {
            if (input.IsNull())
            {
                success = true;
                return(null);
            }

            var keyConvertor   = context.Get <K>();
            var valueConvertor = context.Get <V>();


            var builder = new DictionaryBuilder(context, outputType, keyConvertor, valueConvertor);

            if (builder.TryCreateInstance() == false)
            {
                success = false;
                return(null);
            }
            var mapper = new Mapper(input);

            if (mapper.Error != null)
            {
                context.AddException(mapper.Error);
                success = false;
                return(null);
            }

            while (mapper.MoveNext())
            {
                if (builder.Add(mapper.Key, mapper.Value) == false)
                {
                    success = false;
                    return(null);
                }
            }

            success = true;
            return(builder.Instance);
        }
Пример #7
0
        /// <summary>
        /// 返回指定类型的对象,其值等效于指定对象。
        /// </summary>
        /// <param name="context"> </param>
        /// <param name="input"> 需要转换类型的对象 </param>
        /// <param name="outputType"> 换转后的类型 </param>
        /// <param name="success"> 是否成功 </param>
        /// <returns> </returns>
        protected override T?ChangeTypeImpl(ConvertContext context, object input, Type outputType, out bool success)
        {
            if (input.IsNull())
            {
                success = true;
                return(null);
            }

            var conv = context.Get <T>();

            return(conv.ChangeType(context, input, conv.OutputType, out success));
        }
Пример #8
0
        /// <summary>
        /// 返回指定类型的对象,其值等效于指定字符串对象。
        /// </summary>
        /// <param name="context"> </param>
        /// <param name="input"> 需要转换类型的字符串对象 </param>
        /// <param name="outputType"> 换转后的类型 </param>
        /// <param name="success"> 是否成功 </param>
        protected override TimeSpan ChangeType(ConvertContext context, string input, Type outputType, out bool success)
        {
            TimeSpan result;

            success = TimeSpan.TryParse(input, out result) ||
                      TimeSpan.TryParseExact(input, _Formats, null, out result);
            if (success == false)
            {
                var number = context.Get <long>().ChangeType(context, input, typeof(long), out success);
                if (success)
                {
                    return(TimeSpan.FromTicks(number));
                }
            }
            return(result);
        }
Пример #9
0
        /// <summary>
        /// 返回指定类型的对象,其值等效于指定对象。
        /// </summary>
        /// <param name="context"> </param>
        /// <param name="input"> 需要转换类型的对象 </param>
        /// <param name="outputType"> 换转后的类型 </param>
        /// <param name="success"> 是否成功 </param>
        /// <returns> </returns>
        protected override T[] ChangeTypeImpl(ConvertContext context, object input, Type outputType, out bool success)
        {
            if ((input == null) || input is DBNull)
            {
                success = true;
                return(null);
            }

            var convertor   = context.Get <T>();
            var array       = new ArrayList();
            var elementType = convertor.OutputType;

            //获取对象的枚举器
            var ee = (input as IEnumerable)?.GetEnumerator()
                     ?? input as IEnumerator;

            if (ee == null)
            {
                var value = convertor.ChangeType(context, input, elementType, out success);
                if (success == false)
                {
                    success = false;
                    return(null);
                }
                array.Add(value);
                success = true;
                return((T[])array.ToArray(elementType)); //输出数组
            }

            while (ee.MoveNext()) //循环转换枚举器中的对象,并构造数组
            {
                var value = convertor.ChangeType(context, ee.Current, elementType, out success);
                if (success == false)
                {
                    context.AddException($"{value?.ToString() ?? "<null>"} 写入数组失败!");
                    return(null);
                }
                array.Add(value);
            }
            success = true;
            return((T[])array.ToArray(elementType)); //输出数组
        }
Пример #10
0
        /// <summary>
        /// 返回指定类型的对象,其值等效于指定字符串对象。
        /// </summary>
        /// <param name="context"> </param>
        /// <param name="input"> 需要转换类型的字符串对象 </param>
        /// <param name="outputType"> 换转后的类型 </param>
        /// <param name="success"> 是否成功 </param>
        protected override T[] ChangeType(ConvertContext context, string input, Type outputType, out bool success)
        {
            input = input?.Trim() ?? "";
            if (input.Length == 0)
            {
                success = true;
                return((T[])Array.CreateInstance(outputType.GetElementType(), 0));
            }
            if ((input[0] == '[') && (input[input.Length - 1] == ']')) //判断如果是json字符串,使用json方式转换
            {
                try
                {
                    var result = ComponentServices.ToJsonObject(outputType, input);
                    success = true;
                    return((T[])result);
                }
                catch (Exception ex)
                {
                    context.AddException(ex);
                    success = false;
                    return(null);
                }
            }

            var convertor = context.Get <T>();
            var items     = input.Split(_Separator, StringSplitOptions.None);
            var array     = Array.CreateInstance(convertor.OutputType, items.Length);

            for (var i = 0; i < items.Length; i++)
            {
                var value = convertor.ChangeType(context, items[i], convertor.OutputType, out success);
                if (success == false)
                {
                    context.AddException($"{value?.ToString() ?? "<null>"} 写入数组失败!");
                    return(null);
                }
                array.SetValue(value, i);
            }
            success = true;
            return((T[])array);
        }
Пример #11
0
 /// <summary>
 /// 返回指定类型的对象,其值等效于指定对象。
 /// </summary>
 /// <param name="context"> 上下文 </param>
 /// <param name="input"> 需要转换类型的对象 </param>
 /// <param name="outputType"> 换转后的类型 </param>
 /// <param name="success"> 是否成功 </param>
 object IConvertor.ChangeType(ConvertContext context, object input, Type outputType, out bool success)
 => (TOutput)context.Get <T>().ChangeType(context, input, outputType, out success);
Пример #12
0
 /// <summary>
 /// 返回指定类型的对象,其值等效于指定字符串。
 /// </summary>
 /// <param name="context"> 上下文 </param>
 /// <param name="input"> 需要转换类型的字符串对象 </param>
 /// <param name="outputType"> 换转后的类型 </param>
 /// <param name="success"> 是否成功 </param>
 TOutput IConvertor <TOutput> .ChangeType(ConvertContext context, string input, Type outputType, out bool success)
 => (TOutput)context.Get <T>().ChangeType(context, input, outputType, out success);
Пример #13
0
        /// <summary>
        /// 返回指定类型的对象,其值等效于指定字符串对象。
        /// </summary>
        /// <param name="context"> </param>
        /// <param name="input"> 需要转换类型的字符串对象 </param>
        /// <param name="outputType"> 换转后的类型 </param>
        /// <param name="success"> 是否成功 </param>
        protected override IntPtr ChangeType(ConvertContext context, string input, Type outputType, out bool success)
        {
            var num = context.Get <long>().ChangeType(context, input, typeof(long), out success);

            return(success ? new IntPtr(num) : default(IntPtr));
        }