2017-04-13 100 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

相关问题