FastDev介绍系列之[数据类型转换类]
2008-05-02 23:58 xiaosonl 阅读(1980) 评论(5) 收藏 举报
这是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.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);
}
}
}
使用方法: Converters.ChangeType<T>(toChangeObject) 或 toChangeObject.ChangeType<T>()
测试如下:










































































源代码:































































扩展方法:






















--------------------------个人签名的分割线--------------------------------------
我的个人综合博客:http://www.xiaosonl.com