2017-04-13 156 views
0

假設我有2個類(其中一個來自我的實體框架,另一個是全局的,它在整個應用程序中可用,而EF一個不是)它們都具有相同的屬性和田野。除了這個例子,有沒有一種更簡單快捷的方式將實體類轉換爲全局類?將1類轉換爲另一個具有相同字段的類

全球一個:

public class CompanyOwner 
{ 
    public Guid OwnerId { get; set; } 
    public string CompanyName { get; set; } 
    public string Address { get; set; } 
    public string Phone { get; set; } 
    public string Email { get; set; } 
} 

實體模型類

public class dbOwner 
{ 
    public Guid OwnerId { get; set; } 
    public string CompanyName { get; set; } 
    public string Address { get; set; } 
    public string Phone { get; set; } 
    public string Email { get; set; } 
} 

的方式即時通訊現在在做什麼吧:

 CompanyOwner owner = new CompanyOwner(); 
     Owner dbOwner = entities.FirstOrDefault(.....)// some LINQ 
     owner.CompanyName = dbOwner.CompanyName; 
     owner.Address = dbOwner.Address; 
     owner.Email = dbOwner.Email; 
     owner.Phone = dbOwner.Phone; 

回答

5

AutoMapper這裏是你的朋友。

從主頁

AutoMapper是一個對象的對象映射器。對象 - 對象映射的工作原理是 將一種類型的輸入對象轉換爲另一種類型的輸出對象。 AutoMapper的有趣之處在於它提供了一些有趣的約定,使得不需要從 中弄清楚如何映射類型A到類型B.只要類型B遵循 AutoMapper建立的約定,映射所需的幾乎爲零的配置爲 兩種類型。

-1

這是投的唯一途徑,否則你可以創建相同class.But我更喜歡創造全球一流的IT也可以從兩個不同的表中讀取數據的時候有用的兩個不同的對象那時我們只需要在全局類中添加字段。

2

因爲有許多微小的邊緣案件,在這樣的映射感興趣的特殊功能,你可能也建議使用圖書館等AutoMapper所推薦的gsharp

但是,爲了讓您對如何構建這樣一個映射器有所瞭解,下面是一個非常簡單的映射器。這將找到目標類型的所有屬性,其名稱與源類型(不區分大小寫)的屬性相匹配,然後生成一個編譯委託來實例化目標類型的新實例(在這種情況下使用默認構造函數),以及然後使用源實例中的值初始化屬性。

這是絕對最基本的形式,但應該給你一個mapper的工作原理。然後,通過分析所有構造函數並找到合適的構造函數(以支持不可變類型)來擴展它。當屬性類型不匹配時執行類型轉換操作;即使命名慣例不同,您也可以添加識別名稱匹配的功能(my_propertyMyPropertymyProperty);而這樣的例子不勝枚舉。

FPGA實現:

Func<TSource, TTarget> CreateMapper<TSource, TTarget>() 
    where TTarget : new() 
{ 
    var sourceProperties = typeof(TSource) 
     .GetProperties() 
     .Where(x => x.CanRead); 
    var targetProperties = typeof(TTarget) 
     .GetProperties() 
     .Where(x => x.CanWrite) 
     .ToDictionary(x => x.Name, x => x, StringComparer.OrdinalIgnoreCase); 

    var source = Expression.Parameter(typeof(TSource), "source"); 
    var target = Expression.Variable(typeof(TTarget)); 
    var allocate = Expression.New(typeof(TTarget)); 
    var assignTarget = Expression.Assign(target, allocate); 

    var statements = new List<Expression>(); 
    statements.Add(assignTarget); 

    foreach (var sourceProperty in sourceProperties) 
    { 
     PropertyInfo targetProperty; 
     if (targetProperties.TryGetValue(sourceProperty.Name, out targetProperty)) 
     { 
      var assignProperty = Expression.Assign(
       Expression.Property(target, targetProperty), 
       Expression.Property(source, sourceProperty)); 
      statements.Add(assignProperty); 
     } 
    } 

    statements.Add(target); 

    var body = Expression.Block(new[] { target }, statements); 

    return Expression.Lambda<Func<TSource, TTarget>>(body, source).Compile(); 
} 

用法:

var mapper = CreateMapper<dbOwner, CompanyOwner>(); 

var source = new dbOwner 
{ 
    OwnerId = Guid.NewGuid(), 
    CompanyName = "My Name", 
    Address = "My Address", 
    Phone = "My Phone", 
    Email = "My Email" 
}; 

var mapped = mapper(source); 
+1

Plusone精選不懶惰像我一樣;-) – gsharp

+0

這是真正有用的.. TNX – vlad

相關問題