Mapping business Objects and Entity Object with reflection c#

前端 未结 3 1912
一生所求
一生所求 2020-12-20 02:03

I want to somehow map entity object to business object using reflection in c# -

public class Category
    {
        public int CategoryID { get; set; }
            


        
相关标签:
3条回答
  • 2020-12-20 02:13

    You can use Automapper or Valueinjecter

    Edit:

    Ok I wrote a function that uses reflection, beware it is not gonna handle cases where mapped properties aren't exactly equal e.g IList won't map with List

    public static void MapObjects(object source, object destination)
    {
        Type sourcetype = source.GetType();
        Type destinationtype = destination.GetType();
    
        var sourceProperties = sourcetype.GetProperties();
        var destionationProperties = destinationtype.GetProperties();
    
        var commonproperties = from sp in sourceProperties
                               join dp in destionationProperties on new {sp.Name, sp.PropertyType} equals
                                   new {dp.Name, dp.PropertyType}
                               select new {sp, dp};
    
        foreach (var match in commonproperties)
        {
            match.dp.SetValue(destination, match.sp.GetValue(source, null), null);                   
        }            
    }
    
    0 讨论(0)
  • 2020-12-20 02:24

    http://automapper.codeplex.com/

    My vote is for auto mapper. I currently use this. I've done performance tests on it, and although it is not as fast as hand mapping (below):

    Category c = new Category 
      {
        id = entity.id,
        name = entity.name
      };
    

    The trade off for mapping automatically makes it an obvious choice, at least for the entity to business layer mapping. I actually hand map from the business layer to the view model because I need the flexibility.

    0 讨论(0)
  • 2020-12-20 02:26

    This is something that I wrote to do what I think you are trying to do and you don't have to cast your business objects:

    public static TEntity ConvertObjectToEntity<TEntity>(object objectToConvert, TEntity entity) where TEntity : class
        {
            if (objectToConvert == null || entity == null)
            {
                return null;
            }
    
            Type BusinessObjectType = entity.GetType();
            PropertyInfo[] BusinessPropList = BusinessObjectType.GetProperties();
    
            Type EntityObjectType = objectToConvert.GetType();
            PropertyInfo[] EntityPropList = EntityObjectType.GetProperties();
    
            foreach (PropertyInfo businessPropInfo in BusinessPropList)
            {
                foreach (PropertyInfo entityPropInfo in EntityPropList)
                {
                    if (entityPropInfo.Name == businessPropInfo.Name && !entityPropInfo.GetGetMethod().IsVirtual && !businessPropInfo.GetGetMethod().IsVirtual)
                    {
                        businessPropInfo.SetValue(entity, entityPropInfo.GetValue(objectToConvert, null), null);
                        break;
                    }
                }
            }
    
            return entity;
        }
    

    Usage example:

    public static Category GetCategory(int id)
        {
            return ConvertObjectToEntity(Database.GetCategoryEntity(id), new Category());
        }
    
    0 讨论(0)
提交回复
热议问题