เข้าถึงคุณสมบัติที่ซ่อนอยู่ผ่านคลาสพื้นฐาน c#

ใน ASP.NET Core API ของฉัน ฉันมีคลาส 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
ตามที่คำตอบในคำถามอื่นของคุณแนะนำ คุณต้องใช้ virtual และ override การซ่อนคุณสมบัติจะใช้ได้ก็ต่อเมื่อไม่มีสิ่งใดเข้าถึงเป็นคลาสฐาน แต่ถ้าคุณส่งวัตถุเป็นคลาสฐาน มันจะใช้คุณสมบัติที่ซ่อนอยู่ ไม่ใช่คุณสมบัติการซ่อน 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 ฉันไม่คิดว่าคำถามนี้ซ้ำกับคำถามเดิมของฉัน อย่างที่ฉันบอกไปแล้ว ฉันทำให้ตัวอย่างโค้ดของฉันเรียบง่ายเกินไปในคำถามอื่น นอกจากนี้ วิธีแก้ปัญหาใช้ไม่ได้ในกรณีนี้ เนื่องจากฉันไม่สามารถแทนที่คุณสมบัติด้วยประเภทที่มาจากประเภทคุณสมบัติดั้งเดิมได้ ดู สิ่งนี้ และยกเลิกการใส่เครื่องหมายข้อคิดเห็นคำหลัก 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