.NET下一个类型转换神器Conveter

.NET下一个类型转换神器Conveter

神器来了

名称:今天主角转换器叫Converter,这是花费我几天时间才琢磨出来。.

代码:http://files.cnblogs.com/files/kewei/Conveter.rar

功能:今它支持基础类型、decimal、guid和枚举相互转换以及这些类型的可空类型和数组类型相互转换,支持字典和DynamicObject转换为对象以及字典和DynamicObject的数组转换为对象数组。

扩展性:可以增加其它类型转换,或修改某种转换规则,也就是说转换器是支持功能部分重写和功能扩展的,功能移除也支持,比如想干掉DynamicObject类型的转换也可以。

神器使用方法

1、使用静态方法Converter.Cast(object value,Type targetType)或其泛型方法 :Converter.Cast<int?[]>(new[] {null, "2" }

2、实例化来调用new Converter().Convert(new[] { null, "2" }, typeof(int?));

Converter的扩展

扩展是灵魂,如果没有扩展功能,这东东JavaScriptSerializer.ConvertToType()有啥区别Converter在扩展方面下了一翻功夫。

转换器里包含多个转换单元,这些单元可以增加、删除、替换和调整顺序,自定义的单元,可以从已有单元派生,也可以完整实现,然后插入到转换器的转换单元管理器中,转换器就升级了。

而转换单元本身也能调用转换器来转换,这就形成一种可扩展的递归。

关系代码如下:

转换器由转换单元组成

/// <summary>

/// 类型转换

/// </summary>

public Converter()

{

    this.Items = new ContertItems()

        .AddLast<NoConvert>()

        .AddLast<NullConvert>()

        .AddLast<PrimitiveContert>()

        .AddLast<NullableConvert>()

        .AddLast<DictionaryConvert>()

        .AddLast<ArrayConvert>()

        .AddLast<DynamicObjectConvert>();

}

转换单元可以调用转换器

/// <summary>

/// 定义类型转换单元

/// </summary>

public interface IConvert

{

    /// <summary>

    /// 将value转换为目标类型

    /// 并将转换所得的值放到result

    /// 如果不支持转换,则返回false

    /// </summary>

    /// <param name="converter">转换器实例</param>

    /// <param name="value">要转换的值</param>

    /// <param name="targetType">转换的目标类型</param>

    /// <param name="result">转换结果</param>

    /// <returns>如果不支持转换,则返回false</returns>

    bool Convert(Converter converter, object value, Type targetType, out object result);

}

删除转换单元:

var converter = new Converter();

converter.Items.Remove<DynamicObjectConvert>();

增加转换单元:

编写一个单元,实现IConvert接口,比如 class JObjectConvert:IConvert{},然后就可以把这个转换单元添加到转换器实例中,

var converter = new Converter();

converter.Items.AddFrist<JObjectConvert>();

转换单元重写:

比如从string转换为decimal类时,要求5位小数,我们可以写一个单元,class MyPrimitiveContert:PrimitiveContert{},然后改写里面的Convert方法,再把MyPrimitiveContert替换转换器里的PrimitiveContert单元

var converter = new Converter();

converter.Items.Replace<PrimitiveContert, MyPrimitiveContert>()

.NET下一个类型转换神器Conveter