Отображение бизнес-объектов и объектов Entity с отражением c # - PullRequest
2 голосов
/ 08 марта 2011

Я хочу как-то отобразить объект сущности на бизнес-объект, используя отражение в c # -

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

Мой класс сущности имеет те же свойства, что и CategoryId и CategoryName. Любая лучшая практика с использованием отражения или динамической оценки будет приветствоваться.

Ответы [ 3 ]

15 голосов
/ 08 марта 2011

Вы можете использовать Automapper или Valueinjecter

Редактировать:

Хорошо, я написал функцию, которая использует отражение, будьте осторожны, он не будет обрабатыватьслучаи, когда сопоставленные свойства не совсем равны, например, IList не будет отображаться с 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 голосов
/ 10 июля 2012

Это то, что я написал, чтобы сделать то, что, я думаю, вы пытаетесь сделать, и вам не нужно приводить бизнес-объекты:

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;
    }

Пример использования:

public static Category GetCategory(int id)
    {
        return ConvertObjectToEntity(Database.GetCategoryEntity(id), new Category());
    }
0 голосов
/ 08 марта 2011

http://automapper.codeplex.com/

Мой голос за авто картограф.Я в настоящее время использую это.Я провел тесты производительности на нем, и хотя это не так быстро, как ручное отображение (ниже):

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

Компромисс для отображения автоматически делает его очевидным выбором, по крайней мере, для объекта:отображение бизнес-уровня.Я фактически передаю карту из бизнес-уровня в модель представления, потому что мне нужна гибкость.

...