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

时间:2011-04-27 21:03:40

标签: c# asp.net visual-studio-2010

我正在为同事重构一些代码。有问题的程序访问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;
} 

2 个答案:

答案 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允许您按名称实例化(以及许多其他重载)