2016-02-16 6 views
2

Я интегрируюсь с Quickbooks Desktop, используя их SDK. Я хочу создать общий список предметов. Их общий запрос элемента верхнего уровня возвращает все элементы (как тип IORItemRet), а затем имеет разные подтипы предметов в элементе верхнего уровня. Эти подтипы не наследуются от базового класса Item, поэтому я должен смотреть на каждый возвращаемый элемент, использовать оператор switch для определения его типа, а затем сопоставлять свойства этого конкретного типа с моим общим классом QuickbooksItem.Как высушить этот код

Как вы можете видеть ниже, код является излишним. Я хотел бы иметь возможность инкапсулировать общие настройки типа свойства ListID и Name, если это вообще возможно.

Любые идеи СУХОЙ этот код? Я думаю, что, как минимум, я мог бы создать функцию, которая принимает (ref qbItem, string ListId, string Name) и назовет ее в каждом case ... но это все еще довольно влажно ... Я надеялся на что-то немного DRYer.

public static QuickbooksItem ConvertQueryResponseToClass(IORItemRet itemRet) 
{ 
    var itemType = itemRet.ortype; 
    var typeTest = itemRet.Type; 

    QuickbooksItem qbItem = new QuickbooksItem(); 

    switch (itemType) 
    { 
     case ENORItemRet.orirItemServiceRet: 
      var itemService = itemRet.ItemServiceRet as IItemServiceRet; 
      qbItem.Id = itemService.ListID.GetValue(); 
      qbItem.Name = itemService.Name.GetValue(); 
      qbItem.ItemType = ItemTypes.Service; 
      break; 

     case ENORItemRet.orirItemInventoryRet: 
      var itemInventory = itemRet.ItemInventoryRet as IItemInventoryRet; 
      qbItem.Id = itemInventory.ListID.GetValue(); 
      qbItem.Name = itemInventory.Name.GetValue(); 
      qbItem.ItemType = ItemTypes.Inventory; 
      break; 

     case ENORItemRet.orirItemNonInventoryRet: 
      var itemNonInventory = itemRet.ItemNonInventoryRet as IItemNonInventoryRet; 
      qbItem.Id = itemNonInventory.ListID.GetValue(); 
      qbItem.Name = itemNonInventory.Name.GetValue(); 
      qbItem.ItemType = ItemTypes.NonInventory; 
      break; 

     case ENORItemRet.orirItemOtherChargeRet: 
      var itemOtherCharge = itemRet.ItemOtherChargeRet as IItemOtherChargeRet; 
      qbItem.Id = itemOtherCharge.ListID.GetValue(); 
      qbItem.Name = itemOtherCharge.Name.GetValue(); 
      qbItem.ItemType = ItemTypes.Other; 
      break; 

     case ENORItemRet.orirItemSalesTaxRet: 
      var itemSalesTax = itemRet.ItemSalesTaxRet as IItemSalesTaxRet; 
      qbItem.Id = itemSalesTax.ListID.GetValue(); 
      qbItem.Name = itemSalesTax.Name.GetValue(); 
      qbItem.ItemType = ItemTypes.SalesTax; 
      break; 

     case ENORItemRet.orirItemSalesTaxGroupRet: 
      var itemSalesTaxGroup = itemRet.ItemSalesTaxGroupRet as IItemSalesTaxGroupRet; 
      qbItem.Id = itemSalesTaxGroup.ListID.GetValue(); 
      qbItem.Name = itemSalesTaxGroup.Name.GetValue(); 
      qbItem.ItemType = ItemTypes.SalesTaxGroup; 
      break; 
    } 

    return qbItem; 
} 
+0

Вы можете * сделать что-то с Reflection для свойств, одинаковых для всех типов. – Dave

+0

http://stackoverflow.com/questions/5379730/using-reflection-to-call-a-method-of-a-property – Dave

+0

Итак, * все * эти типы объявляют и реализуют один и тот же тип членов с тем же именем (ListID, Name), но все они делают это без совместного использования базового класса? – Amit

ответ

1

не есть способ проверить это, но что-то, как это должно работать:

var itemType = itemRet.ortype; 
var typeTest = itemRet.Type; 

QuickbooksItem qbItem = new QuickbooksItem(); 

PropertyInfo ListIdProperty = typeTest.GetProperty("ListID"); 
MethodInfo ListValueMethod = ListIdProperty.GetMethod("GetValue"); 

qbItem.Id = (int)ListValueMethod.Invoke(ListIdProperty.GetValue(itemRet, null), null); 
1

Одна идея состоит в том, чтобы использовать LIB как AutoMapper для отображения каждого типа в классе QuickbooksItem.

Таким образом, вам не нужно писать код отражения самостоятельно.

+1

Я люблю Automapper, но если он не изменился недавно, ему нужно будет вручную создать сопоставление для каждого типа, поэтому он все равно будет не очень сухим. – Dave

+0

Правда, но я считаю, что размещение сопоставлений в файле конфигурации делает код чистым –

+0

Вы можете создать карту и до тех пор, пока имена свойств совпадут, они автоматически сопоставят их, не указывая их отдельно –

Смежные вопросы