代码改变世界

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?>(1new 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(20071212)));

            
//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);
        }

    }

}