我正在为同事重构一些代码。有问题的程序访问SQL数据库并使用存储过程来提取不同的数据集。 Visual Studio中有一个datacontext设置,因此可以通过designer.cs文件访问所有这些存储过程。结果看起来像是作为不同类型的对象返回的(即StoredProcAResult,StoredProcBResult)等......
无论如何,我根本不允许更改SQL数据库,但我可以搞乱ASPX和CS文件。目前有三个文件执行几乎相同的功能(显示一组数据)。每个页面调用一个不同的存储过程 - 例如ViewNewProducts,ViewAgedProducts,ViewExpiredProducts。视图是相同的,所以我想将这三个页面合并为一个。
如果我可以触摸SQL,我会重写存储过程以接受参数并返回正确的数据。但是,我不能 - 所以我制作了一个ASPX / CS文件,将变量设置为用户需要的数据集(New,Aged或Expired),现在发现自己正在处理这一行:
Utility.EnhanceGrid(dataBoundItem.Cells, dataSet.salesperson, dataSet.sku);
问题是设置dataSet。原始的单个文件只使用了以下内容:
var dataSet = (INVENTORY.ViewExpiredProductsResult)dataBoundItem.DataItem;
但是现在我不知道在用户选择之前将调用哪个存储过程。
我尝试使用switch语句,但我不能将var声明为null ...我无法输入变量...有没有办法使用字符串值来设置var的类型?
我对此代码有一个解决方法,但我讨厌重复自己,这感觉非常草率......任何建议都会受到赞赏。
switch (usersSelection())
{
case "New":
ViewNewProductsResult newResult = (INVENTORY.ViewNewProductsResult)dataBoundItem.DataItem;
Utility.EnhanceGrid(dataBoundItem.Cells, newResult.salesperson, newResult.sku);
break;
case "Aged":
ViewAgedProductsResult agedResult = (INVENTORY.ViewAgedProductsResult)dataBoundItem.DataItem;
Utility.EnhanceGrid(dataBoundItem.Cells, agedResult.salesperson, agedResult.sku);
break;
case "Expired":
ViewExpiredProductsResult expiredResult = (INVENTORY.ViewExpiredProductsResult)dataBoundItem.DataItem;
Utility.EnhanceGrid(dataBoundItem.Cells, expiredResult.salesperson, expiredResult.sku);
break;
}
答案 0 :(得分:1)
如果使用.NET Framework 4,则可以使用dynamic
类型。所以你的代码会这样:
dynamic dataSet = null;
switch (usersSelection())
{
case "New":
dataSet = (INVENTORY.ViewNewProductsResult)dataBoundItem.DataItem;
break;
case "Aged":
dataSet = (INVENTORY.ViewAgedProductsResult)dataBoundItem.DataItem;
break;
case "Expired":
dataSet = (INVENTORY.ViewExpiredProductsResult)dataBoundItem.DataItem;
break;
}
if (dataSet != null)
{
Utility.EnhanceGrid(dataBoundItem.Cells, dataSet.salesperson, dataSet.sku);
}
实际类型将在运行时确定,但由于每种类型都有销售人员和sku,因此它应该有效。
有关动态的详情MSDN Dynamic Type
答案 1 :(得分:0)
我无法将var键入null
将其键入为对象而不是var
作为旁注,有Activator.CreateInstance允许您按名称实例化(以及许多其他重载)