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

自定义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. UVA 11729 - Commando War(贪心 相邻交换法)

    Commando War There is a war and it doesn't look very promising for your country. Now it's time to ac ...

  2. Android从服务端获取json解析显示在客户端上面

    Android从服务端获取json解析显示在客户端上面 百度经验:jingyan.baidu.com 首先说一下Json数据的最基本的特点,Json数据是一系列的键值对的集合,和XML数据来比,Jso ...

  3. 项目中logger、message错误信息的配置

    申明:在一个项目中必不可少的是Logger和错误信息的配置,现在给出在我们常用的处理方法. —.创建一个ConfigUtils类和他对应的rah.properties文件和Test测试类 Config ...

  4. Cassandra CqlRow fetch DateType / Int32Type

    phpcassa library里有个namespace : use phpcassa\Schema\DataType; 当使用cql query得到cqlrow, int32 & Date ...

  5. Linux 进程编程

    Linux通过维护者五个状态来调度进程的运行.这五个状态分别为:运行.可中断.不可中断.僵死.停止 . PID来标识不同的进程的,Linux中每一个进程都有一个唯一的进程号 . PCB块就是一个进程资 ...

  6. DOS命令中出现空格问题

    1.DOS命令中路径出现空格时如何处理? 在DOS命令中,如果路径中出现空格,可能为报错:如参数错误 如:  xcopy C:\ABC CD\txt.txt C:\ ,   由于路径中包含空格,执行后 ...

  7. 根据日期自增的sql语句

    Insert into wd_orderitem (count , id_dish , state , info , sn , id_order)values(1 , 1000000001 , 3 , ...

  8. 我终于忍不住喷一下某些书了,关于Java传引用的XX言论

    凡是说Java对象传的是引用,简直一派胡言,尤其误导我这种Java初学者,更严重的是以前用过C++的Java初学者. 我们都知道Java建立对象一般都是需要这样的格式: Object obj = ne ...

  9. 写一个TT模板自动生成spring.net下面的配置文件。

    这个是目标. 然后想着就怎么开始 1.

  10. vs2013调试崩溃,重启电脑依旧崩溃

    如果大家遇到 VS断点调试程序崩溃的问题,可以排查是不是有这个问题 VSx新安装了插件 点击工具---扩展和更新  禁用最新安装的程序 一般就没有问题了