c# - 如何干燥这段代码

标签 c# quickbooks intuit-partner-platform

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

正如你在下面看到的,代码相当冗余。如果可能的话,我希望能够封装 ListID 和 Name 的公共(public)属性类型设置。

有什么想法可以干燥这段代码吗?我想至少我可以创建一个接受 (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;
}

最佳答案

我没有办法测试它,但这样的东西应该可以工作:

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

关于c# - 如何干燥这段代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35440830/

相关文章:

Karate 直觉 : How to validate dynamic json array

java - Quickbooks API - 如何使用存储的银行帐户创建费用

java - 如何使用 java SDK 在 token 过期后重新连接到 QBO API

c# - 为 ASP.NET MVC 错误设置不同的语言

c# - 使用 IConfigureOptions 配置注入(inject)的依赖项

swift - Quickbooks 创建一个 TimeActivity

quickbooks - 如何使用 qbXML 将其他数据添加到 Quickbook

c# - 在 xdocument 中移动节点

c# - 我希望我的 C# Windows 服务自动更新

php - 整合字节 : Custom fields are not imported to MySql database