2014-07-10 44 views
3

我可以成功將IDataReader映射到對象列表,但是當我想採用一個DataRow時,它似乎不像預期的那樣工作。使用AutoMapper將DataRow轉換爲對象

我在這裏錯過了一些簡單的東西嗎?

[TestFixture] 
public class AutomapperTest 
{ 
    [Test] 
    public void TestMethod1() 
    { 
     DataTable dt = new DataTable("contact"); 
     dt.Columns.Add("FirstName"); 
     dt.Columns.Add("LastName"); 
     dt.Columns.Add("Line1"); 
     dt.Columns.Add("Line2"); 
     dt.Columns.Add("Line3"); 
     dt.Columns.Add("Suburb"); 
     dt.Columns.Add("State"); 
     dt.Columns.Add("Postcode"); 

     DataRow row = dt.NewRow(); 
     row.ItemArray = new [] { "Little", "Johnny", 
           "1 Random Place", "", "", 
           "Windsor", "Qld", "4030" }; 

     var dest = Mapper.DynamicMap<myObject>(row); 

     Assert.AreEqual(row["FirstName"], "Little"); 
     Assert.IsNotNull(dest); 
     Assert.AreEqual(dest.FirstName, "Little"); 
    } 
} 

目的地類型:

public class myObject 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Line1 { get; set; } 
    public string Line2 { get; set; } 
    public string Line3 { get; set; } 
    public string Suburb { get; set; } 
    public string State { get; set; } 
    public string Postcode { get; set; } 
} 

回答

9

您將必須實現自己的自定義值解析器

https://github.com/AutoMapper/AutoMapper/wiki/Custom-value-resolvers

UPDATE

public class CustomResolver : IValueResolver 
{ 
    public ResolutionResult Resolve(ResolutionResult source) 
    { 
     return source.New(Convert.ChangeType((source.Context.SourceValue as DataRow)[source.Context.MemberName], source.Context.DestinationType)); 
    } 
} 

這裏是如何使用它

Mapper.CreateMap<DataRow,myObject>().ForAllMembers(m=>m.ResolveUsing<CustomResolver>()); 
var dest = Mapper.Map<myObject>(row); 

我建議使用小巧玲瓏。這樣來自數據庫的數據將是強類型或動態的,並且Automapper應該能夠找出映射。

我相信CSV文件可以被Dapper通過ODBC讀取。但對於CSV,我建議使用LinqToCSV Nuget包。

+0

謝謝 - 這是不幸的,它似乎不值得少數列。 – Geoff

+0

用Automapper考慮Dapper。 – Darek

+0

您可以舉一個例子說明自定義值解析器如何在這裏提供幫助? –