这是FastDev.Core程序集中的一个类
Converters, 用于数据类型转换.
使用方法: Converters.ChangeType<T>(toChangeObject) 或 toChangeObject.ChangeType<T>()
测试如下:
using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Runtime.Remoting.Messaging;
using System.Threading;

namespace FastDev.Core.Test


{

/**//// <summary>
/// 测试枚举
/// </summary>
public enum EnumType : int

{
First,
Second
}

[TestClass]
public class ConvertersTest

{
[TestMethod()]
public void TestChangeType()

{
//BaseType Change
ChangeTypeTestHelper<string>(1, "1");
ChangeTypeTestHelper<bool>("True", true);

//T -> Nullable<T>, Not Null
ChangeTypeTestHelper<int?>(1, new Nullable<int>(1));

//Nullable<T> -> T, Not Null
ChangeTypeTestHelper<int>(new Nullable<int>(1), 1);

//Null -> Nullable<T>
int? intNullable = null;
ChangeTypeTestHelper<int?>(null, intNullable);
ChangeTypeTestHelper<int?>(string.Empty, null);

//Nullable<T> -> Null
ChangeTypeTestHelper<object>(intNullable, null);
ChangeTypeTestHelper<int>(intNullable, 0);

//多重转换
ChangeTypeTestHelper<DateTime?>("2007-12-12", new DateTime?(new DateTime(2007, 12, 12)));

//Ojbect -> Enum
ChangeTypeTestHelper<EnumType>("1", EnumType.Second);
ChangeTypeTestHelper<EnumType>((object)"1", EnumType.Second);
ChangeTypeTestHelper<EnumType>((object)1, EnumType.Second);
}

public void ChangeTypeTestHelper<T>(object toChangeObject, T expected)

{
Assert.AreEqual(expected, Converters.ChangeType<T>(toChangeObject));
}

[TestMethod]
public void TestChangeEnumerableType()

{

string[] strArr =
{ "1", "2" };
List<long> longArr = strArr.ChangeEnumerableType<long>();
Assert.AreEqual(2, longArr.Count);
Assert.AreEqual(1, longArr[0]);
Assert.AreEqual(2, longArr[1]);


object[] objArr =
{ EnumType.First, EnumType.Second };
List<EnumType> enumArr = objArr.ChangeEnumerableType<EnumType>();
Assert.AreEqual(EnumType.First, enumArr[0]);
}
}
}

源代码:
using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Runtime.Remoting.Messaging;
using System.Threading;

namespace FastDev.Core.Test


{

/**//// <summary>
/// 测试枚举
/// </summary>
public enum EnumType : byte

{
First,
Second
}

[TestClass]
public class ConvertersTest

{
[TestMethod()]
public void TestChangeType()

{
//BaseType Change
ChangeTypeTestHelper<string>(1, "1");
ChangeTypeTestHelper<bool>("True", true);

//T -> Nullable<T>, Not Null
ChangeTypeTestHelper<int?>(1, new Nullable<int>(1));

//Nullable<T> -> T, Not Null
ChangeTypeTestHelper<int>(new Nullable<int>(1), 1);

//Null -> Nullable<T>
int? intNullable = null;
ChangeTypeTestHelper<int?>(null, intNullable);
ChangeTypeTestHelper<int?>(string.Empty, null);

//Nullable<T> -> Null
ChangeTypeTestHelper<object>(intNullable, null);
ChangeTypeTestHelper<int>(intNullable, 0);

//多重转换
ChangeTypeTestHelper<DateTime?>("2007-12-12", new DateTime?(new DateTime(2007, 12, 12)));

//Ojbect -> Enum
ChangeTypeTestHelper<EnumType>("1", EnumType.Second);
ChangeTypeTestHelper<EnumType>((object)"1", EnumType.Second);
ChangeTypeTestHelper<EnumType>((object)1, EnumType.Second);
}

public void ChangeTypeTestHelper<T>(object toChangeObject, T expected)

{
Assert.AreEqual(expected, Converters.ChangeType<T>(toChangeObject));
}

[TestMethod]
public void TestChangeEnumerableType()

{

string[] strArr =
{ "1", "2" };
List<long> longArr = strArr.ChangeEnumerableType<long>();
Assert.AreEqual(2, longArr.Count);
Assert.AreEqual(1, longArr[0]);
Assert.AreEqual(2, longArr[1]);
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Linq;
using System.Collections;

namespace FastDev.Core


{

/**//// <summary>
/// 类型转换
/// </summary>
public static class Converters

{

/**//// <summary>
/// 强制类型转换, 如果为枚举, 则按枚举值计算
/// </summary>
/// <typeparam name="T">要转换成的类型</typeparam>
/// <param name="toChangeObject">转换目标</param>
public static T ChangeType<T>(object toChangeObject)

{
Type conversionType = typeof(T);

if (Convert.IsDBNull(toChangeObject) || toChangeObject == null || toChangeObject.ToString() == "")

{
return default(T);
}

// 只支持值的转换, 不支持Enum字面的转换
if (conversionType.IsEnum) // Object -> Enum = Object -> UnderlyingType -> Enum

{
toChangeObject = Convert.ChangeType(toChangeObject, Enum.GetUnderlyingType(conversionType));
return (T)toChangeObject;
}

//如果转换类型为Nullable<T>, 就将转换类型变成T
if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition() == (typeof(Nullable<>)))

{
NullableConverter nullableConverter = new NullableConverter(conversionType);
conversionType = nullableConverter.UnderlyingType;
}

return (T)Convert.ChangeType(toChangeObject, conversionType);
}


/**//// <summary>
/// 数组的强制类型转换, 如果为枚举, 则按枚举值计算
/// </summary>
/// <typeparam name="T">要转换成的类型</typeparam>
/// <param name="toChangeObject">转换目标</param>
public static List<T> ChangeEnumerableType<T>(IEnumerable enumerable)

{
List<T> result = new List<T>();
foreach (object item in enumerable)

{
result.Add(item.ChangeType<T>());
}

return result;
}
}
}

扩展方法:
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Collections;

namespace FastDev.Core


{
public static class ConvertersExtensions

{
public static T ChangeType<T>(this object toChangeObject)

{
return Converters.ChangeType<T>(toChangeObject);
}

public static List<T> ChangeEnumerableType<T>(this IEnumerable enumerable)

{
return Converters.ChangeEnumerableType<T>(enumerable);
}
}
}
