Akses properti tersembunyi melalui kelas dasar c#

Di API Inti ASP.NET saya, saya memiliki kelas DTO BaseBDto dan DerivedBDto lain yang mewarisinya, dan menyembunyikan beberapa propertinya, karena diperlukan di DerivedBDto. Properti BaseBDto dan DerivedBDto adalah objek dari kelas lain, masing-masing BaseADto dan DerivedADto, yang mengikuti logika yang sama seperti yang pertama. Saya juga memiliki kelas BaseModel dimana BaseBDto dan DerivedBDto akan dipetakan melalui kelas lain Mapper.

Sesuatu seperti kode berikut:

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

Namun ternyata, saat meneruskan objek DerivedBDto ke metode MapToModel, objek tersebut mencoba mengakses nilai BaseBDto (yaitu null) dan bukan nilai DerivedBDto.

Apakah ada cara saya bisa mencapai perilaku ini?

Saya hanya dapat mendeklarasikan BaseBDto sebagai abstrak, tetapi hal itu akan mencegah saya membuat instance, yang perlu saya lakukan.

PS: Saya sudah menanyakan pertanyaan serupa di sini, tapi saya terlalu menyederhanakan contoh kode saya, jadi saya merasa perlu ada pertanyaan lain. Selain itu, solusi yang diberikan di sana tidak berfungsi karena saya tidak dapat mengganti properti A di DerivedBDto dengan DerivedADto karena harus memiliki tipe yang sama dengan properti A di BaseBDto.


person Luis Costa    schedule 21.01.2020    source sumber
comment
Seperti yang disarankan oleh jawaban di pertanyaan Anda yang lain, Anda perlu menggunakan virtual dan override. Menyembunyikan properti hanya berfungsi jika tidak ada yang mengaksesnya sebagai kelas dasar, tetapi jika Anda meneruskan objek sebagai kelas dasar, properti tersembunyi akan digunakan, bukan properti penyembunyian. Virtual dan Override adalah apa yang ingin Anda selesaikan.   -  person Tarazed    schedule 21.01.2020
comment
Apakah ini menjawab pertanyaan Anda? Akses properti tersembunyi di kelas dasar c#   -  person Tarazed    schedule 21.01.2020
comment
Di masa mendatang, pertimbangkan untuk mengedit pertanyaan Anda yang sudah ada. Tidak perlu membuat duplikat.   -  person Tarazed    schedule 21.01.2020
comment
@Tarazed Saya rasa pertanyaan ini bukan duplikat dari pertanyaan asli saya. Seperti yang saya katakan, saya terlalu menyederhanakan contoh kode saya di pertanyaan lain. Selain itu, solusinya tidak berfungsi dalam kasus khusus ini, karena saya tidak bisa mengganti properti dengan tipe yang diturunkan dari tipe properti asli. Lihat ini dan batalkan komentar pada kata kunci virtual dan override untuk mengubah kesalahan kompilasi.   -  person Luis Costa    schedule 22.01.2020
comment
Jika tipe pengembalian Anda berbeda, Anda tidak boleh menyembunyikan apa pun, Anda harus mempertimbangkan untuk menggunakan nama yang berbeda. Pada titik itu, fungsinya benar-benar berbeda.   -  person Tarazed    schedule 22.01.2020


Jawaban (1)


Sudahkah Anda mencoba mengubah tanda tangan MapToModel menjadi generik. Di bawah

public static BaseModel MapToModel<T>(T dto) where T : BaseBDto => new BaseModel
{
    NameModel = dto.A.Name
};
person Troy Palacino    schedule 21.01.2020
comment
Ini menghasilkan perilaku yang sama dengan metode MapToModel versi saya. - person Luis Costa; 22.01.2020