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();这个方法,并没有 ...
随机推荐
- Codevs 1171 潜伏者 2009年NOIP全国联赛提高组
1171 潜伏者 2009年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description [问题描述] R 国和S 国正陷 ...
- C++输入输出缓冲区的刷新问题
当我们对文件流进行操作的时候,它们与一个streambuf 类型的缓存(buffer)联系在一起.这个缓存(buffer)实际是一块内存空间,作为流(stream)和物理文件的媒介.例如,对于一个输出 ...
- git ignore已经checked in files
对于untracked file, 可以使用.gitignore 对于已经checked in file,可以使用git update-index #隐藏 git update-index --ass ...
- javaScript & jquery完美判断图片是否加载完毕
好久没写东西了,正好最近因为工作需要,写了一个瀑布流异步加载的程序. 今天就不谈瀑布流,来谈一下关于load的问题. ----------------------------------------- ...
- PHP 面向对象之自定义类
所谓面向对象就是什么时候什么东西做什么,我们设计类的时候需要想的就是怎么做的内容,那么怎么样的一个类才算是符合OOP的思想呢,答案是:这个类写好之后,在使用的过程中,能准确的代表一个事物,在书写的时候 ...
- 网络流系列算法总结(bzoj 3438 1061)
网络流嘛,怎么看都是一堆逗逼题嘛,反正遇到还是都做不起嘛.... 网络流的模板非常简单,难点都在于建图,网络流的建图解决问题范围之广,下至A+B Problem,上至单纯形,线性规划.所以如果对于网络 ...
- libSVM 参数选择
libSVM 参数选择 [预测标签,准确率,决策值]=svmpredict(测试标签,测试数据,训练的模型); 原文参考:http://blog.csdn.net/carson2005/art ...
- 【技术贴】关闭CMD错误提示声音
关掉后,整个世界清静多了. cmd打开后 1. 禁用“嘀嘀”声的设备来源,这是由beep驱动服务所提供,可以将beep驱动的启动类型设置为禁用,可以打开CMD窗口,运行以下命令:永久禁用错误声音 sc ...
- CAS单点登录配置[2]:证书生成
上一篇介绍了准备工作,本片将介绍如何生成证书. 服务器端证书 1 我们在F盘下建立一个cas文件夹,在此文件夹中生成证书文件,打开命令窗口,进入此目录下,如图: 2 生成服务器端证书, 此命令用于在当 ...
- iOS开发UI篇—UITableviewcell的性能问题
iOS开发UI篇—UITableviewcell的性能问题 一.UITableviewcell的一些介绍 UITableView的每一行都是一个UITableViewCell,通过dataSource ...