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();这个方法,并没有 ...
随机推荐
- Batch file Functions
Quote from: http://ss64.com/nt/syntax-functions.html Batch file Functions Packaging up code into a d ...
- java.util.HashMap源码分析
在java jdk8中对HashMap的源码进行了优化,在jdk7中,HashMap处理“碰撞”的时候,都是采用链表来存储,当碰撞的结点很多时,查询时间是O(n). 在jdk8中,HashMap处理“ ...
- apache虚拟主机安装注意事项
apache虚拟主机在添加的时候,总是会有一些莫名其妙的问题,后来发现可以使用一个参数去验证的: xxxxx/httpd -S //这个参数会去检查虚拟主机配置的正确性,很好用 因为有时候可能就是缩进 ...
- ci验证码
ci 之验证码 为了方便,把 system/system/helpers/captcha_helper.php复制放在 application/helpers/文件夹里面 手册上面推荐用数据库,但个人 ...
- hadoop1中partition和combiner作用
---恢复内容开始--- 1.解析Partiton 把map任务的输出的中间结果按照key的范围进行划分成r份,r代表reduce任务的个数.hadoop默认有个类HashPartition实现分区, ...
- VMware网络选项分析
摘自资料:VMware网卡选项分析.zip 很多朋友都曾问到关于Guest和Host互联,其实这并不是一件困难的事情,只要能够理解VMware的网络模型即可,今天结合着我的虚拟机,来详细介绍一下VMw ...
- VC释放EXE资源文件
原文地址:http://blog.csdn.net/wangningyu/article/details/4378378 今天有个朋友问到VC能否释放多个EXE.DLL或WAV等文件,我便做了个实例给 ...
- OneAPM Cloud Test——系统性能监控神器
2015 年 8 月,OneAPM 推出了一款系统性能监控产品--Cloud Test,产品上线以来以「两低一高」的特点迅速成为市场增长率最快的一匹黑马.「两低一高」,即低使用成本.低学习成本以及高服 ...
- Spring+SpringMVC+Mybatis 利用AOP自定义注解实现可配置日志快照记录
http://my.oschina.net/ydsakyclguozi/blog/413822
- Multiplication Puzzle
题目大致意思是:一个整数序列包含N个1~100的整数(3<=N<=100),从中取出一个数并和相邻两边的整数相乘,依次进行下去直到只剩下首尾两个数为止,求最终的得到的和的最小值.两边的数不 ...