viewModel как viewModelExtended, приведение? - PullRequest
1 голос
/ 22 марта 2011

У меня проблемы с тем, как это сделать.У меня есть два класса;ProductViewModel и ProductExtendedViewModel.

Мой сценарий в основном состоит в том, что ProductExtendedViewModel наследует ProductViewModel, и я хочу привести ProductViewModel к ProductExtendedViewModel.Как мне поступить так?

Это то, что я пытался до сих пор безуспешно:

viewModelExtended = (ViewModelExtended) viewModel;

Я получаю подсказку, что при приведении числа значение должно быть на число меньшезатем бесконечность

Я не настолько хорош в наследовании и кастинге, так что это все для меня как-то ново, поэтому, пожалуйста, поймите, вроде как вопрос новичка.

спасибо

РЕДАКТИРОВАТЬ

public class ProductViewModel
{
    public string Name { get; set; }
    public Product Product { get; set; }
}

public class ProductExtendedViewModel : ProductViewModel
{
    public string ExtendedName { get; set; }
}

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Ответы [ 2 ]

3 голосов
/ 22 марта 2011

К сожалению, в c # вы не можете привести из базового типа к производному типу («downcasting»), потому что вы пытаетесь генерировать информацию (т.е. какое значение должно иметь ExtendedName?).

Лучше всего сделать это с помощью композиции - создайте конструктор на ProductExtendedViewModel, который принимает ProductViewModel:

public class ProductExtendedViewModel : ProductViewModel
{
    public ProductExtendedViewModel()
    {
    }

    public ProductExtendedViewModel(ProductViewModel viewModel)
    {
        Name = viewModel.Name;
        Product = viewModel.Product;
    }

    public string ExtendedName { get; set; }
}

, который затем можно назвать:

var productModel = new ProductViewModel {Name = product.Name, Product = product};

var derived = new ProductExtendedViewModel(productModel);

Примечаниечто вы все еще можете преобразовать тип Derived обратно в его базовый тип, так как это приводит к потере информации:

var basetype = (ProductViewModel)derived;

Я считаю, что «Совет по устранению неполадок» из «При приведении из числа [...] "в этом случае - красная сельдь, и это всего лишь помощь в кастинге.

1 голос
/ 22 марта 2011

Как сказал Жаф, вы не можете быть удручённым в C #. Альтернативой его решению было бы использование AutoMapper для создания экземпляра наследующего класса. Это будет выглядеть так:

var productExtendedViewModel = Mapper.Map<ProductViewModel, ProductExtendedViewModel>(productViewModel);

См. Документацию о том, как вы можете настроить отображение, но основное отображение будет создано следующим образом:

Mapper.CreateMap<ProductViewModel, ProductExtendedViewModel>();

AutoMapper - хороший инструмент для обработки всех сопоставлений между бизнес-объектами и моделями представления.

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