Создать метод расширения для сопоставления лица с subentities объект Поко объекта


Я пытаюсь создать метод расширения, который строит объект поко (копирует все поля) для объекта.

Когда объект простой (нет навигации, нет суб коллекций), он отлично работает. Я хочу улучшить его, чтобы он также мог иметь дело с суб-сущностей.

Для этого примера я беру базе Nortwind и использованию клиентов и организаций заказа. Мой Покос:

 public class CustomerPOCO : BaseDataItemModel
    {
        public string CustomerID { get; set; }
        public string CompanyName { get; set; }
        public string ContactName { get; set; }

        List<OrderPOCO> orders;

       [PropertySubCollection]
        public List<OrderPOCO> Orders
        {
            get { return orders; }
            set { orders = value; }
        }


        public CustomerPOCO()
        {
            orders = new List<OrderPOCO>();
        }

    }


public class OrderPOCO : BaseDataItemModel
{

   public int OrderID { get; set; }
   public string ShipName { get; set; }
   public string ShipCity { get; set; }

}

Метод Расширения:

 public static void CopyPropertiesFrom<TObjectTarget>(
           this ICollection<TObjectTarget> targetitems, System.Collections.IEnumerable sourceitems)
            where TObjectTarget : new()
        {
            foreach (var source in sourceitems)
            {

                TObjectTarget targetObject = new TObjectTarget();

                PropertyInfo[] allProporties = source.GetType().GetProperties();

                PropertyInfo targetProperty;
                foreach (PropertyInfo fromProp in allProporties)
                {
                    targetProperty = targetObject.GetType().GetProperty(fromProp.Name);



                    if (targetProperty == null) continue;
                    if (!targetProperty.CanWrite) continue;

                    //check if property in target class marked with SkipProperty Attribute
                    if (targetProperty.GetCustomAttributes(typeof(SkipPropertyAttribute), true).Length != 0) continue;


                    //Sub Collection -> set it here
                    if (targetProperty.GetCustomAttributes(typeof(PropertySubCollection), true).Length != 0)
                    {

                    }
                    else

                        targetProperty.SetValue(targetObject, fromProp.GetValue(source, null), null);


                }

                targetitems.Add(targetObject);

            }
        }

static void Main(string[] args)
 {
      List<CustomerPOCO> customers;
      using (NorthwindEntities northcontext = new NorthwindEntities())
      {
          var cus = from customer in northcontext.Customers
                  select customer;

          customers = new List<CustomerPOCO>();
          customers.CopyPropertiesFrom(cus);              

      }
   }

Примечание: модуль должен знать тип подсущность и типа суб-поко...



5708
2
задан 4 августа 2011 в 08:08 Источник Поделиться
Комментарии
1 ответ

Для этой задачи, я хотел бы использовать AutoMapper, это именно то, что вам нужно, и можете работать со сложными структурами.

Если вы пишете этот маппер себя, рекомендуется использовать выражение функции компиляции.
Такой код будет выполняться на скорость пользовательского кода, с все толкования отражения сделано заранее. Увидеть пример кода для выражений.MemberInit

Что касается суб-объекты в вашем коде, вы будете выяснить рекурсивную процедуру, как только вы перепишите расширение для работы с аргументом типа, не универсальный аргумент. Таким образом, вы можете легко вызвать процедуру для свойств, зная их тип из PropertyInfo.

3
ответ дан 4 августа 2011 в 09:08 Источник Поделиться