ใน 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
virtual
และoverride
เพื่อสลับข้อผิดพลาดในการคอมไพล์ - person Luis Costa   schedule 22.01.2020