提供一种将值的类型转换为其他类型以及访问标准值和子属性的统一方法。

自定义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://msdn.microsoft.com/zh-cn/library/system.componentmodel.typeconverter.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

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 数据转换的更多相关文章

  1. 利用Python进行数据分析(14) pandas基础: 数据转换

    数据转换指的是对数据的过滤.清理以及其他的转换操作. 移除重复数据 DataFrame里经常会出现重复行,DataFrame提供一个duplicated()方法检测各行是否重复,另一个drop_dup ...

  2. Linux C编程学习6---字符串处理、数据转换

    1.字符串 应用程序按其功能可分为数值计算.非数值计算以及输入输出操作等.非数值计算程序占相当大的比例,其核心就是字符串处理1.1.字符测试 1.1.1.测试字符是否为英文字母 int isalpha ...

  3. .NET LINQ数据转换

    使用 LINQ 进行数据转换      语言集成查询 (LINQ) 不仅可用于检索数据, 而且还是一个功能强大的数据转换工具. 通过使用 LINQ 查询,您可以将源序列用作输入,并采用多种方式修改它以 ...

  4. 【转】C#中将JSon数据转换成实体类,将实体类转换成Json

    http://wo13145219.iteye.com/blog/2022667 http://json2csharp.chahuo.com/ using System; using System.C ...

  5. LINQ之路 7:子查询、创建策略和数据转换

    在前面的系列中,我们已经讨论了LINQ简单查询的大部分特性,了解了LINQ的支持计术和语法形式.至此,我们应该可以创建出大部分相对简单的LINQ查询.在本篇中,除了对前面的知识做个简单的总结,还会介绍 ...

  6. SSIS数据转换后数值总数差异过大

    之前做过一个项目,犯了一个小错误,写出来给大家分享一下,以防大家出同样的错误. 做了一个ETL包,对货品的销售额进行数据转换,字符型 --〉 浮点型: 之后对销售额进行求和,在测试数据结果时发现与销售 ...

  7. SpringMVC 数据转换 & 数据格式化 & 数据校验

    数据绑定流程 1. Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象 ...

  8. 关于JAVA的数据转换总结

    数据转换在编程里面是十分常用的,将平常可能用到的数据转换类型总结起来会在以后码代码的过程中有很大帮助. 在数据转换之前,需要明白的是基础数据类型的自动转换和强制转换.接下来就先从数据类型的容量讲起. ...

  9. mysql的数据转换

    在sql语句中完成对数字类型的数据转换成字符类型的数据.像这次将读取出来的float类型的数据,在进行jsonObject.fromObject(object).toString();这个方法,并没有 ...

随机推荐

  1. 「Windows MFC 」「Edit Control」 控件

    「Windows MFC 」「Edit Control」 控件

  2. 九度OJ 1077 最大序列和 -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1077 题目描述: 给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的“序列和”. 对 ...

  3. Iptables網路連線限制及攻擊防護和相關設定

    [筆記整理]Iptables網路連線限制及攻擊防護和相關設定 1. 限制每個IP連接HTTP最大併發50個連接數 iptables -A INPUT -p tcp --dport 80 -m conn ...

  4. Google Map 自定义 infowindow

    最近做的东西用到了infowindow,不过google提供的样式太难看了,于是想改变一下样式.看了一下好像infowindow的样式不太好改. 查了半天资料,看到一个infobox,感觉真的挺好用. ...

  5. express开发实例

    express获取参数有三种方法:官网介绍如下 Checks route params (req.params), ex: /user/:id Checks query string params ( ...

  6. C语言实现的顺序表

    顺序表是用一段地址连续的存储单元依次存储数据元素的线性结构.顺序表可分为静态存储和动态存储,静态顺序表比较简单,数据空间固定,而动态顺序表可以动态增容,便于存放大量数据,现主要把动态的基本实现一下~此 ...

  7. Android中的pix,sp,dp相关概念

    px( pixel) 像素,可以简单的理解为一个点或方块,用以颜色的显示(单位),一般指印刷品或屏幕设置设备的颜色显示定义. dip(device independent pixels)设备独立像素. ...

  8. 常见内部函数----Python

    In [10]: test = [1,2,"yes"] ---append(x) 追加到链尾 In [11]: test.append(1) In [12]: test Out[1 ...

  9. ▲历史回眸--abbr和acronym的渊源

    网景和微软的浏览器之战早已淡去多年,最终以微软的IE浏览器胜出,特别是IE6的出现,一度成为世界浏览器的霸主,至今无人能敌.去年IE6荣获“终身成就奖”,真是实至名归.本文涉及的两个标签abbr和ac ...

  10. 两台主机打通ssh

    ssh打通基本概念:如果需要通过SSH进行远程登录,我们一般是需要手动输入密码,但如果将SSH之间的权限打通的话,就可以实现无密码登录.这对shell脚本的定时执行有很大的帮助. (一),生成秘钥,先 ...