我正在使用 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/