/// <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); }
/// <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; }
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); } }
/// <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)); }
/// <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)); }
/// <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); }
/// <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)); }
/// <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); }
/// <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)); //输出数组 }
/// <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); }
/// <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);
/// <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);
/// <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)); }