Я интегрируюсь с 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;
}
Вы можете * сделать что-то с Reflection для свойств, одинаковых для всех типов. – Dave
http://stackoverflow.com/questions/5379730/using-reflection-to-call-a-method-of-a-property – Dave
Итак, * все * эти типы объявляют и реализуют один и тот же тип членов с тем же именем (ListID, Name), но все они делают это без совместного использования базового класса? – Amit