2014-07-10 46 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

您可以举一个例子说明自定义值解析器如何在这里提供帮助? –