09.AutoMapper 之自定義型別轉換器(Custom Type

daxuesheng發表於2021-09-09

自定義型別轉換器(Custom Type Converters)

有時需要完全控制一種型別到另一種型別的轉換。這一般發生在兩種型別不同,已經存在轉換函式,並且希望從弱型別轉變為強型別,如源型別的字串到目標型別Int32。

例如,假設我們的源型別為:

public class Source{
    public string Value1 { get; set; }    public string Value2 { get; set; }    public string Value3 { get; set; }
}

你又想對映到以下目標型別:

 public class Destination{
    public int Value1 { get; set; }    public DateTime Value2 { get; set; }    public Type Value3 { get; set; }
}

如果我們嘗試直接對映這兩種型別, AutoMapper 將丟擲一個異常 (在執行對映時和配置檢查時), 因為AutoMapper不知道從stringintDateTimeType的該如何對映。 要為這些型別建立對映,我們必須提供自定義型別轉換器,我們有以下三種方法:

void ConvertUsing(Func<TSource, TDestination> mappingFunction);void ConvertUsing(ITypeConverter<TSource, TDestination> converter);void ConvertUsing<TTypeConverter>() where TTypeConverter : ITypeConverter<TSource, TDestination>;

第一種方法是寫一個委託來指定如何轉換源型別到目標型別。如

cfg.CreateMap<string,int>().ConvertUsing(s=>Convert.ToInt32(s));

這種方法只能處理簡單型別的情況,針對複合型別的情況我們需要建立自定義的ITypeConverter<TSource, TDestination>轉換器:

public interface ITypeConverter<in TSource, TDestination>{    TDestination Convert(TSource source, TDestination destination, ResolutionContext context);
}

AutoMapper提供自定義型別轉換器的例項,或者只提供型別,AutoMapper將在執行時例項化。然後,上面的源/目標型別的對映配置變為:

[Test]public void Example(){
    Mapper.Initialize(cfg => {
      cfg.CreateMap<string, int>().ConvertUsing(s => Convert.ToInt32(s));
      cfg.CreateMap<string, DateTime>().ConvertUsing(new DateTimeTypeConverter());
      cfg.CreateMap<string, Type>().ConvertUsing<TypeTypeConverter>();
      cfg.CreateMap<Source, Destination>();
    });
    Mapper.AssertConfigurationIsValid();

    var source = new Source
    {
        Value1 = "5",
        Value2 = "01/01/2000",
        Value3 = "AutoMapperSamples.GlobalTypeConverters.GlobalTypeConverters+Destination"
    };

    Destination result = Mapper.Map<Source, Destination>(source);
    result.Value3.ShouldEqual(typeof(Destination));
}public class DateTimeTypeConverter : ITypeConverter<string, DateTime>
{    public DateTime Convert(string source, DateTime destination, ResolutionContext context)
    {        return System.Convert.ToDateTime(source);
    }
}public class TypeTypeConverter : ITypeConverter<string, Type>
{    public Type Convert(string source, Type destination, ResolutionContext context)
    {          return Assembly.GetExecutingAssembly().GetType(source);
    }
}

在第一個對映中,從string到Int32,我們只使用內建的Convert.ToInt32函式。
接下來的兩個對映使用了自定義ITypeConverter實現。

自定義型別轉換器的真正強大的地方在於,AutoMapper可以在任何源/目標型別上使用它們。我們可以在使用其他對映配置上方構建一組自定義型別轉換器,而無需任何額外配置。在上面的例子中,我們永遠不需要再次指定string/int 轉換。如果必須在型別成員級別配置自定義值解析器,則自定義型別轉換器的範圍是全域性的。

系統型別轉換器

.NETFramework 透過TypeConverter類支援型別轉換器的概念。AutoMapper 在配置檢查和對映時支援這些型別的型別轉換器,而且不需要手動配置。AutoMappe透過使用TypeDescriptor.GetConverter方法確定源/目標型別是否可對映。



作者:這個使用者有點逗
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4692/viewspace-2820161/,如需轉載,請註明出處,否則將追究法律責任。

相關文章