C# TypeConverter 数据转换
提供一种将值的类型转换为其他类型以及访问标准值和子属性的统一方法。
自定义Converter:
public class GenericListTypeConverter<T> : TypeConverter
{
protected readonly TypeConverter typeConverter; public GenericListTypeConverter()
{
typeConverter = TypeDescriptor.GetConverter(typeof(T));
if (typeConverter == null)
throw new InvalidOperationException("No type converter exists for type " + typeof(T).FullName);
} protected virtual string[] GetStringArray(string input)
{
if (!String.IsNullOrEmpty(input))
{
string[] result = input.Split(',');
Array.ForEach(result, s => s.Trim());
return result;
}
else
return new string[];
} public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{ if (sourceType == typeof(string))
{
string[] items = GetStringArray(sourceType.ToString());
return items.Any();
} return base.CanConvertFrom(context, sourceType);
} public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is string)
{
string[] items = GetStringArray((string)value);
var result = new List<T>();
Array.ForEach(items, s =>
{
object item = typeConverter.ConvertFromInvariantString(s);
if (item != null)
{
result.Add((T)item);
}
}); return result;
}
return base.ConvertFrom(context, culture, value);
} public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string))
{
string result = string.Empty;
if (((IList<T>)value) != null)
{
//we don't use string.Join() because it doesn't support invariant culture
for (int i = ; i < ((IList<T>)value).Count; i++)
{
var str1 = Convert.ToString(((IList<T>)value)[i], CultureInfo.InvariantCulture);
result += str1;
//don't add comma after the last element
if (i != ((IList<T>)value).Count - )
result += ",";
}
}
return result;
} return base.ConvertTo(context, culture, value, destinationType);
}
}
var a = new Converter.GenericListTypeConverter<int>().ConvertFrom("1,2,3");
List<int> b = (List<int>)a;
public class ShippingOptionTypeConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
{
return true;
} return base.CanConvertFrom(context, sourceType);
} public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is string)
{
ShippingOption shippingOption = null;
string valueStr = value as string;
if (!String.IsNullOrEmpty(valueStr))
{
try
{
using (var tr = new StringReader(valueStr))
{
var xmlS = new XmlSerializer(typeof(ShippingOption));
shippingOption = (ShippingOption)xmlS.Deserialize(tr);
}
}
catch
{
//xml error
}
}
return shippingOption;
}
return base.ConvertFrom(context, culture, value);
} public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string))
{
var shippingOption = value as ShippingOption;
if (shippingOption != null)
{
var sb = new StringBuilder();
using (var tw = new StringWriter(sb))
{
var xmlS = new XmlSerializer(typeof(ShippingOption));
xmlS.Serialize(tw, value);
string serialized = sb.ToString();
return serialized;
}
}
else
{
return "";
}
} return base.ConvertTo(context, culture, value, destinationType);
}
} public class ShippingOptionListTypeConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
{
return true;
} return base.CanConvertFrom(context, sourceType);
} public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is string)
{
List<ShippingOption> shippingOptions = null;
string valueStr = value as string;
if (!String.IsNullOrEmpty(valueStr))
{
try
{
using (var tr = new StringReader(valueStr))
{
var xmlS = new XmlSerializer(typeof(List<ShippingOption>));
shippingOptions = (List<ShippingOption>)xmlS.Deserialize(tr);
}
}
catch
{
//xml error
}
}
return shippingOptions;
}
return base.ConvertFrom(context, culture, value);
} public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string))
{
var shippingOptions = value as List<ShippingOption>;
if (shippingOptions != null)
{
var sb = new StringBuilder();
using (var tw = new StringWriter(sb))
{
var xmlS = new XmlSerializer(typeof(List<ShippingOption>));
xmlS.Serialize(tw, value);
string serialized = sb.ToString();
return serialized;
}
}
else
{
return "";
}
} return base.ConvertTo(context, culture, value, destinationType);
}
}
http://www.cnblogs.com/takako_mu/archive/2012/10/08/2715594.html
扩展:GenericEnumConverter
http://msdn.microsoft.com/zh-cn/library/system.configuration.genericenumconverter(v=VS.80).aspx
扩展函数定义简单数据类型转换:
public static class ExtensionMethods
{
#region 转换函数
/// <summary>
/// object 转换为 int
/// </summary>
/// <returns></returns>
private static int ObjToInt(object obj)
{
if (obj == null)
return ;
if (obj.Equals(DBNull.Value))
return ; int returnValue; if (int.TryParse(obj.ToString(), out returnValue))
{
return returnValue;
}
else
{
return ;
}
} /// <summary>
/// 转换为boolean型
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
private static bool ObjToBool(object obj)
{
if (obj == null)
return false;
if (obj.Equals(DBNull.Value))
return false; bool returnValue; if (bool.TryParse(obj.ToString(), out returnValue))
{
return returnValue;
}
else
{
return false;
}
} /// <summary>
/// object 转换为 int?
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
private static int? ObjToIntNull(object obj)
{
if (obj == null)
return null;
if (obj.Equals(DBNull.Value))
return null; return ObjToInt(obj);
} /// <summary>
/// object 转换为 string
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
private static string ObjToStr(object obj)
{
if (obj == null)
return "";
if (obj.Equals(DBNull.Value))
return "";
return Convert.ToString(obj);
} /// <summary>
/// object 转换为 decimal
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
private static decimal ObjToDecimal(object obj)
{
if (obj == null)
return ;
if (obj.Equals(DBNull.Value))
return ; try
{
return Convert.ToDecimal(obj);
}
catch
{
return ;
}
} /// <summary>
/// object 转换为 decimal?
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
private static decimal? ObjToDecimalNull(object obj)
{
if (obj == null)
return null;
if (obj.Equals(DBNull.Value))
return null; return ObjToDecimal(obj);
} /// <summary>
/// 转换为日期
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
private static DateTime? ObjToDateNull(object obj)
{
if (obj == null)
{
return null;
}
try
{
return Convert.ToDateTime(obj);
}
catch
{
return null;
}
}
#endregion #region 数据转换扩展函数 /// <summary>
/// object 转换为 int
/// </summary>
/// <returns></returns>
public static int ToInt(this object obj)
{
return ObjToInt(obj);
} /// <summary>
/// object 转换为 string
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static string ToStr(this object obj)
{
return ObjToStr(obj);
} /// <summary>
/// object 转换为 decimal
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static decimal ToDecimal(this object obj)
{
return ObjToDecimal(obj);
} /// <summary>
/// object 转换为 int?
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static int? ToIntNull(this object obj)
{
return ObjToIntNull(obj);
} /// <summary>
/// object 转换为 decimal?
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static decimal? ToDecimalNull(this object obj)
{
return ObjToDecimalNull(obj);
} /// <summary>
/// 转换为boolean型
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static bool ToBool(this object obj)
{
return ObjToBool(obj);
} /// <summary>
/// 转换为日期
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static DateTime? ToDateNull(this object obj)
{
return ObjToDateNull(obj);
} /// <summary>
/// 转换为Double
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static double ToDouble(this decimal value)
{
return Convert.ToDouble(value);
}
#endregion
}
C# TypeConverter 数据转换的更多相关文章
- 利用Python进行数据分析(14) pandas基础: 数据转换
数据转换指的是对数据的过滤.清理以及其他的转换操作. 移除重复数据 DataFrame里经常会出现重复行,DataFrame提供一个duplicated()方法检测各行是否重复,另一个drop_dup ...
- Linux C编程学习6---字符串处理、数据转换
1.字符串 应用程序按其功能可分为数值计算.非数值计算以及输入输出操作等.非数值计算程序占相当大的比例,其核心就是字符串处理1.1.字符测试 1.1.1.测试字符是否为英文字母 int isalpha ...
- .NET LINQ数据转换
使用 LINQ 进行数据转换 语言集成查询 (LINQ) 不仅可用于检索数据, 而且还是一个功能强大的数据转换工具. 通过使用 LINQ 查询,您可以将源序列用作输入,并采用多种方式修改它以 ...
- 【转】C#中将JSon数据转换成实体类,将实体类转换成Json
http://wo13145219.iteye.com/blog/2022667 http://json2csharp.chahuo.com/ using System; using System.C ...
- LINQ之路 7:子查询、创建策略和数据转换
在前面的系列中,我们已经讨论了LINQ简单查询的大部分特性,了解了LINQ的支持计术和语法形式.至此,我们应该可以创建出大部分相对简单的LINQ查询.在本篇中,除了对前面的知识做个简单的总结,还会介绍 ...
- SSIS数据转换后数值总数差异过大
之前做过一个项目,犯了一个小错误,写出来给大家分享一下,以防大家出同样的错误. 做了一个ETL包,对货品的销售额进行数据转换,字符型 --〉 浮点型: 之后对销售额进行求和,在测试数据结果时发现与销售 ...
- SpringMVC 数据转换 & 数据格式化 & 数据校验
数据绑定流程 1. Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象 ...
- 关于JAVA的数据转换总结
数据转换在编程里面是十分常用的,将平常可能用到的数据转换类型总结起来会在以后码代码的过程中有很大帮助. 在数据转换之前,需要明白的是基础数据类型的自动转换和强制转换.接下来就先从数据类型的容量讲起. ...
- mysql的数据转换
在sql语句中完成对数字类型的数据转换成字符类型的数据.像这次将读取出来的float类型的数据,在进行jsonObject.fromObject(object).toString();这个方法,并没有 ...
随机推荐
- MongoDB笔记(一)MongoDB概述和安装
概述 关键词:关系数据库.非关系数据库 关系数据库: 关系数据库,是建立在关系数据库模型基础上的数据库,借助于集合代数等概念和方法来处理数据库中的数据.目前主流的关系数据库有oracle.SQL.ac ...
- Ubuntu下gcc及g++环境配置
直接在命令行中输入以下命令即可. sudo apt-get install build-essential 安装完成后输入 gcc 和 g++ 进行确认.
- Lambda Expression In Java
题记在阅读JDK源码java.util.Collections的时候在UnmodifiableCollection类中看到了这么一段代码: public void forEach(Consumer& ...
- IE11的CSS兼容性问题
最近测试给了我一大堆BUG,一瞅发现全是IE11的.吐槽一下这个浏览器真的比较特立独行.很多默认的样式跟别的浏览器不同,而且最明显的一点应该是padding左右内边距往往比别的浏览器大了一倍.但是当需 ...
- php Static静态关键字
静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名的方式进行调用.静态属性不允许对象使用->操作符调用. class Car { private static $speed = ...
- PHP 自 5.2 到 5.6 中新增的功能详解
截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5.3 [注].因为 PHP 那 ...
- Delphi实用小function
Write Log // strLog : the log content need write to log file; // strFile: the compliete file path(in ...
- hadoop1——map到reduce中间的shuffle过程
---恢复内容开始--- shuffle和排序 过程图如下: MapReduce确保每个reduce的输入都按键排序,系统执行排序的过程——将map输出作为输入传给reduce——成为shuffle, ...
- iOS 图片填充 UIImageView
UIViewContentModeScaleAspectFit, //这个图片都会在view里面显示,并且比例不变 这就是说 如果图片和view的比例不一样 就会有留白如下图1 UIView ...
- Servlet的一些API使用介绍
final String rootPath = getServletConfig().getServletContext().getRealPath("/"); 获取项目运行的根 ...