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

Я рефакторинг кода для коллеги. Данная программа обращается к базе данных 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;
} 

Ответы [ 2 ]

1 голос
/ 28 апреля 2011

При использовании .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

0 голосов
/ 28 апреля 2011

Я не могу ввести переменную как ноль

Введите ее как объект вместо переменной

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...