我正在使用他们的SDK与Quickbooks Desktop集成。我想构建一个通用的Item列表。它们的一般顶级项目查询返回所有项目(类型为IORItemRet
),然后在顶级项目中具有不同的项目子类型。这些子类型不从基类Item类继承,因此我必须查看每个返回的项目,使用switch语句确定其类型,然后将该特定类型的属性映射到我的通用QuickbooksItem类。
如下所示,代码非常冗余。我希望能够封装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;
}
答案 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类。
这样您就不需要自己编写反射代码了。