#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.Создайте экземпляр, который позволит вам создавать экземпляры по имени (и многим другим перегрузкам)