如何干掉这段代码

时间:2016-02-16 18:57:32

标签: c# quickbooks intuit-partner-platform intuit

我正在使用他们的SDK与Quickbooks Desktop集成。我想构建一个通用的Item列表。它们的一般顶级项目查询返回所有项目(类型为IORItemRet),然后在顶级项目中具有不同的项目子类型。这些子类型不从基类Item类继承,因此我必须查看每个返回的项目,使用switch语句确定其类型,然后将该特定类型的属性映射到我的通用Qu​​ickbooksItem类。

如下所示,代码非常冗余。我希望能够封装ListID和Name的公共属性类型设置,如果可能的话。

任何想要干掉这段代码的想法?我想至少我可以创建一个接受(ref qbItem, string ListId, string Name)并在每个case中调用它的函数......但是这仍然很潮湿...我希望有点干嘛

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

一个想法是使用像AutoMapper之类的lib将每种类型映射到您的QuickbooksItem类。

这样您就不需要自己编写反射代码了。