需要在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;
} 

需要在c# /ASP中动态实例化不同的对象.NET - Visual Studio 2010

如果使用。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。创建实例,允许您通过名称(和许多其他重载)进行实例化