Доступ к скрытому свойству через базовый класс с #

В моем API ASP.NET Core у меня есть класс DTO BaseBDto и другой DerivedBDto, который наследуется от него и скрывает некоторые из его свойств, потому что они требуются в DerivedBDto. Свойства BaseBDto и DerivedBDto являются объектами других классов, BaseADto и DerivedADto соответственно, которые следуют той же логике, что и первые. У меня также есть BaseModel класс, которому BaseBDto и DerivedBDto будут сопоставлены через другой класс Mapper.

Что-то вроде следующего кода:

using System.ComponentModel.DataAnnotations;

public class BaseADto
{
    public string Name { get; set; }
}

public class DerivedADto : BaseADto
{
    [Required]
    public new string Name { get; set; }
}

public class BaseBDto
{
    public BaseADto A { get; set; }
}

public class DerivedBDto : BaseBDto
{
    [Required]
    public new DerivedADto A { get; set; }
}

public class BaseModel
{
    public string NameModel { get; set; }
}

public static class Mapper
{
    public static BaseModel MapToModel(BaseBDto dto) => new BaseModel
    {
        NameModel = dto.A.Name
    };
}

Но оказывается, что при передаче объекта DerivedBDto методу MapToModel он пытается получить доступ к значениям BaseBDto (которые равны null) вместо DerivedBDto.

Есть ли способ добиться такого поведения?

Я могу думать только об объявлении BaseBDto абстрактным, но это помешает мне создать его экземпляр, что мне нужно сделать.

PS: я уже задавал аналогичный вопрос здесь, но я упростил мой образец кода, поэтому я решил, что нужен еще один вопрос. Кроме того, предоставленное там решение не работает, потому что я не могу переопределить свойство A в DerivedBDto на DerivedADto, поскольку оно должно иметь тот же тип, что и свойство A в BaseBDto.


person Luis Costa    schedule 21.01.2020    source источник
comment
Как подсказал ответ на ваш другой вопрос, вам нужно использовать виртуальный и переопределить. Скрытие свойств работает только в том случае, если ничто никогда не обращается к нему как к базовому классу, но если вы передадите объект в качестве базового класса, он будет использовать свойство hidden, а не свойство скрытия. Virtual и Override - это то, что вы хотите решить.   -  person Tarazed    schedule 21.01.2020
comment
Отвечает ли это на ваш вопрос? Доступ к скрытому свойству в базовом классе c #   -  person Tarazed    schedule 21.01.2020
comment
В будущем рассмотрите возможность изменения существующего вопроса. Не нужно создавать дубликат.   -  person Tarazed    schedule 21.01.2020
comment
@Tarazed Я не думаю, что этот вопрос дублирует мой исходный. Как я уже сказал, я слишком упростил свой пример кода в другом вопросе. Кроме того, решение не работает в этом конкретном случае, потому что я не могу переопределить свойство с типом, производным от исходного типа свойства. См. this и раскомментируйте ключевые слова virtual и override, чтобы переключить ошибки компиляции.   -  person Luis Costa    schedule 22.01.2020
comment
Если ваш возвращаемый тип отличается, вы не должны ничего скрывать, вам следует подумать об использовании другого имени. На тот момент это совершенно другой функционал.   -  person Tarazed    schedule 22.01.2020


Ответы (1)


Вы пробовали изменить подпись MapToModel на общую. Нижеприведенное

public static BaseModel MapToModel<T>(T dto) where T : BaseBDto => new BaseModel
{
    NameModel = dto.A.Name
};
person Troy Palacino    schedule 21.01.2020
comment
Это приводит к тому же поведению, что и моя версия метода MapToModel. - person Luis Costa; 22.01.2020