Необходимо динамически создавать экземпляры различных объектов в C # / ASP.NET — Visual Studio 2010

#c# #asp.net #visual-studio-2010

#c# #asp.net #visual-studio-2010

Вопрос:

Я рефакторирую некоторый код для коллеги. Рассматриваемая программа обращается к базе данных SQL и использует хранимые процедуры для извлечения различных наборов данных. В Visual Studio есть настройка datacontext, поэтому ко всем этим хранимым процедурам можно получить доступ через файл 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… Я не могу ввести переменную … есть ли способ использовать строковое значение для задания типа переменной?

У меня есть обходной путь с этим кодом, но я ненавижу повторяться, и это кажется ужасно неаккуратным…буду признателен за любой совет.

 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;
} 
  

Ответ №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);
}
  

Фактический тип будет определен во время выполнения, но поскольку у каждого типа есть продавец и артикул, он должен работать.

Подробнее о динамике здесь MSDN Dynamic Type

Ответ №2:

Я не могу ввести var как null

Введите это как object вместо var

В качестве примечания есть Activator.Создайте экземпляр, который позволит вам создавать экземпляры по имени (и многим другим перегрузкам)