需要在c# /ASP中动态实例化不同的对象.NET - Visual Studio 2010
本文关键字:对象 NET 2010 Studio Visual 实例化 ASP 动态 | 更新日期: 2023-09-27 17:53:13
我正在为同事重构一些代码。所讨论的程序访问SQL数据库并使用存储过程提取不同的数据集。在Visual Studio中有一个数据上下文设置,因此可以通过designer.cs文件访问所有这些存储过程。结果看起来像它们作为不同类型的对象返回(即StoredProcAResult, StoredProcBResult)等…
无论如何,我不允许改变SQL数据库在所有,但我可以与ASPX和CS文件搞砸。目前有三个文件执行几乎相同的功能(显示一组数据)。每个页面调用一个不同的存储过程——比如ViewNewProducts、ViewAgedProducts、ViewExpiredProducts。视图是相同的,所以我想把这三页合二为一。
如果我可以使用SQL,我将重写存储过程以接受参数并返回适当的数据。然而,我不能-所以我做了一个ASPX/CS文件,有一个变量设置为用户需要的数据集(新,老化,或过期),现在发现自己处理这一行:
Utility.EnhanceGrid(dataBoundItem.Cells, dataSet.salesperson, dataSet.sku);
问题是设置数据集。原始的单个文件只是使用了像这样的东西:
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;
}
如果使用。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动态类型
我不能输入var为null
将其键入object而不是var
作为旁注,有Activator。创建实例,允许您通过名称(和许多其他重载)进行实例化