最近做項目,需要把DataTable中的數據強類型化.於是試用了下比較常用的AutoMapper,通過看代碼中附帶的Demo與網上的教程,也算能夠勉強使用了,現將學習筆記記錄如下:
namespace ConsoleApplication1
{
class Program
{
static void Main( string[] args)
{
// 1.普通轉換
Name name1 = new Name() { FirstName = " L ", LastName = " jz " };
Mapper.CreateMap<Name, NameDto>()
.BeforeMap((name, nameDto) => Console.WriteLine( " hello world before "))
.AfterMap((name, nameDto) => Console.WriteLine( " hello world after "));
NameDto nameDto1 = Mapper.Map<Name, NameDto>(name1);
Console.WriteLine( " 1 ");
Console.WriteLine(nameDto1.FirstName + nameDto1.LastName);
Console.WriteLine();
// Console.ReadKey();
// 整體設置
// 2.整體即時轉換
Mapper.Reset();
Name name2 = new Name() { FirstName = " L ", LastName = " jz " };
Mapper.CreateMap<Name, NameDto>()
.ConstructUsing(name => new NameDto() { AllName = name.FirstName + name.LastName });
NameDto nameDto2 = Mapper.Map<Name, NameDto>(name2);
Console.WriteLine( " 2 ");
Console.WriteLine(nameDto2.AllName);
Console.WriteLine();
// Console.ReadKey();
// 3.整體通過TypeConverter類型轉換
Mapper.Reset();
Name name3 = new Name() { FirstName = " L ", LastName = " jz " };
Mapper.CreateMap<Name, NameDto>()
.ConvertUsing<NameConverter>();
NameDto nameDto3 = Mapper.Map<Name, NameDto>(name3);
Console.WriteLine( " 3 ");
Console.WriteLine(nameDto3.AllName);
Console.WriteLine();
// Console.ReadKey();
// 單屬性設置
// 4.屬性條件轉換
Mapper.Reset();
Name name4 = new Name() { FirstName = " L ", LastName = " jz " };
Mapper.CreateMap<Name, NameDto>()
.ForMember(name => name.FirstName, opt => opt.Condition(name => !name.FirstName.Equals( " l ", StringComparison.OrdinalIgnoreCase)));
NameDto nameDto4 = Mapper.Map<Name, NameDto>(name4);
Console.WriteLine( " 4 ");
Console.WriteLine( string.IsNullOrEmpty(nameDto4.FirstName));
Console.WriteLine();
// Console.ReadKey();
// 5.屬性忽略
Mapper.Reset();
Name name5 = new Name() { FirstName = " L ", LastName = " jz " };
Mapper.CreateMap<Name, NameDto>()
.ForMember(name => name.FirstName, opt => opt.Ignore());
NameDto nameDto5 = Mapper.Map<Name, NameDto>(name5);
Console.WriteLine( " 5 ");
Console.WriteLine( string.IsNullOrEmpty(nameDto5.FirstName));
Console.WriteLine();
// Console.ReadKey();
// 6.屬性轉換
Mapper.Reset();
Name name6 = new Name() { FirstName = " L ", LastName = " jz " };
Mapper.CreateMap<Name, NameDto>()
.ForMember(name => name.AllName, opt => opt.MapFrom(name => name.FirstName + name.LastName));
NameDto nameDto6 = Mapper.Map<Name, NameDto>(name6);
Console.WriteLine( " 6 ");
Console.WriteLine(nameDto6.AllName);
Console.WriteLine();
// Console.ReadKey();
// 7.屬性通過ValueResolver轉換
Mapper.Reset();
Name name7 = new Name() { FirstName = " L ", LastName = " jz " };
Mapper.CreateMap<Name, StoreDto>()
.ForMember(storeDto => storeDto.Name, opt => opt.ResolveUsing<NameResolver>());
StoreDto store1 = Mapper.Map<Name, StoreDto>(name7);
Console.WriteLine( " 7 ");
Console.WriteLine(store1.Name.FirstName + store1.Name.LastName);
Console.WriteLine();
// Console.ReadKey();
// 8.屬性填充固定值
Mapper.Reset();
Name name8 = new Name() { FirstName = " L ", LastName = " jz " };
Mapper.CreateMap<Name, NameDto>()
.ForMember(name => name.AllName, opt => opt.UseValue< string>( " ljzforever "));
NameDto nameDto8 = Mapper.Map<Name, NameDto>(name8);
Console.WriteLine( " 8 ");
Console.WriteLine(nameDto8.AllName);
Console.WriteLine();
// Console.ReadKey();
// 9.屬性格式化
Mapper.Reset();
Name name9 = new Name() { FirstName = " L ", LastName = " jz " };
Mapper.CreateMap<Name, NameDto>()
.ForMember(name => name.FirstName, opt => opt.AddFormatter<StringFormatter>());
NameDto nameDto9 = Mapper.Map<Name, NameDto>(name9);
Console.WriteLine( " 9 ");
Console.WriteLine(nameDto9.FirstName);
Console.WriteLine();
// Console.ReadKey();
// 10.屬性null時的默認值
Mapper.Reset();
Name name10 = new Name() { FirstName = " L " };
Mapper.CreateMap<Name, NameDto>()
.ForMember(name => name.LastName, opt => opt.NullSubstitute( " jz "));
NameDto nameDto10 = Mapper.Map<Name, NameDto>(name10);
Console.WriteLine( " 10 ");
Console.WriteLine(nameDto10.LastName);
Console.WriteLine();
// Console.ReadKey();
// 其它設置與特性
// 11.轉換匿名對象
Mapper.Reset();
object name11 = new { FirstName = " L ", LastName = " jz " };
NameDto nameDto11 = Mapper.DynamicMap<NameDto>(name11);
Console.WriteLine( " 11 ");
Console.WriteLine(nameDto11.FirstName + nameDto11.LastName);
Console.WriteLine();
// Console.ReadKey();
// 12.轉換DataTable
Mapper.Reset();
DataTable dt = new DataTable();
dt.Columns.Add( " FirstName ", typeof( string));
dt.Columns.Add( " LastName ", typeof( string));
dt.Rows.Add( " L ", " jz ");
List<NameDto> nameDto12 = Mapper.DynamicMap<IDataReader, List<NameDto>>(dt.CreateDataReader());
Console.WriteLine( " 12 ");
Console.WriteLine(nameDto12[ 0].FirstName + nameDto12[ 0].LastName);
Console.WriteLine();
// Console.ReadKey();
// emitMapper error
// List<NameDto> nameDto20 = EmitMapper.ObjectMapperManager.DefaultInstance.GetMapper<IDataReader, List<NameDto>>().Map(dt.CreateDataReader());
// 13.轉化存在的對象
Mapper.Reset();
Mapper.CreateMap<Name, NameDto>()
.ForMember(name => name.LastName, opt => opt.Ignore());
Name name13 = new Name() { FirstName = " L " };
NameDto nameDto13 = new NameDto() { LastName = " jz " };
Mapper.Map<Name, NameDto>(name13, nameDto13);
// nameDto13 = Mapper.Map<Name, NameDto>(name13); // 注意,必需使用上面的寫法,不然nameDto13對象的LastName屬性會被覆蓋
Console.WriteLine( " 13 ");
Console.WriteLine(nameDto13.FirstName + nameDto13.LastName);
Console.WriteLine();
// Console.ReadKey();
// 14.Flatten特性
Mapper.Reset();
Mapper.CreateMap<Store, FlattenName>();
Store store2 = new Store() { Name = new Name() { FirstName = " L ", LastName = " jz " } };
FlattenName nameDto14 = Mapper.Map<Store, FlattenName>(store2);
Console.WriteLine( " 14 ");
Console.WriteLine(nameDto14.NameFirstname + nameDto14.NameLastName);
Console.WriteLine();
// Console.ReadKey();
// 15.將Dictionary轉化為對象,現在還不支持
Mapper.Reset();
Mapper.CreateMap<Dictionary< string, object>, Name>();
Dictionary< string, object> dict = new Dictionary< string, object>();
dict.Add( " FirstName ", " L ");
// Name name15 = Mapper.DynamicMap<Dictionary<string, object>, Name>(dict);
Name name15 = Mapper.Map<Dictionary< string, object>, Name>(dict);
Console.WriteLine( " 15 ");
Console.WriteLine(name15.FirstName);
Console.WriteLine();
Console.ReadKey();
}
}
public class Store
{
public Name Name { get; set; }
public int Age { get; set; }
}
public class Name
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class StoreDto
{
public NameDto Name { get; set; }
public int Age { get; set; }
}
public class NameDto
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string AllName { get; set; }
}
public class FlattenName
{
public string NameFirstname { get; set; }
public string NameLastName { get; set; }
}
public class NameConverter : TypeConverter<Name, NameDto>
{
protected override NameDto ConvertCore(Name source)
{
return new NameDto() { AllName = source.FirstName + source.LastName };
}
}
public class NameResolver : ValueResolver<Name, NameDto>
{
protected override NameDto ResolveCore(Name source)
{
return new NameDto() { FirstName = source.FirstName, LastName = source.LastName };
}
}
public class NameFormatter : ValueFormatter<NameDto>
{
protected override string FormatValueCore(NameDto name)
{
return name.FirstName + name.LastName;
}
}
public class StringFormatter : ValueFormatter< string>
{
protected override string FormatValueCore( string name)
{
return name + " - ";
}
}
}
比較遺憾的是現在還不支持將Directory轉化為對象
參考的文章: