У меня есть базовый тип записи и унаследованный тип записи, который добавляет несколько полей. Во время выполнения у меня есть экземпляр базового типа записи, и я хочу преобразовать его в экземпляр унаследованного типа записи, не вводя заново все параметры.
Я попробовал следующее:
public record BaseRecord(string firstName, string lastName);
public record ChildRecord(BaseRecord baseRecord, DateTime dateOfBirth) : BaseRecord(baseRecord);
Теперь я могу сделать следующее:
var baseRecord = new BaseRecord("John", "Doe");
var childRecord = new ChildRecord(baseRecord, new DateTime(2000, 1, 1));
Но, к сожалению, у ChildRecord теперь есть свойство «baseRecord» типа BaseRecord, хотя оно делегируется базовому конструктору, что обычно приводит к тому, что оно опускается и не добавляется в качестве свойства к записи (по крайней мере, я так думал)
Есть ли способ предотвратить создание свойства baseRecord?
Я не хочу записывать все поля, как в C# создает производную запись из экземпляра базовой записи
[Уточнение]:
Спасибо за ответы. Я знал о различных возможностях реализации.
Моя цель состояла в том, чтобы предотвратить повторение всех унаследованных полей, используя «конструктор копирования» базового класса. Но это привело к тому, что унаследованный класс получил «нежелательное» свойство.
На данный момент ответ синго наиболее близок к этой цели. Я жду несколько дней, прежде чем принять его.
Вам нужно вручную добавить конструктор и свойство, как обычный класс.
public record ChildRecord : BaseRecord
{
public DateTime dateOfBirth { get; set; }
public ChildRecord(BaseRecord baseRecord, DateTime dateOfBirth)
: base(baseRecord)
=> this.dateOfBirth = dateOfBirth;
}
Не совсем то, на что я надеялся, но самое короткое решение и без повторения всех унаследованных свойств.
Как сказал @shingo, вы можете добавить новый конструктор для его обработки.
Пишите по-другому
public record BaseRecord(string firstName, string lastName);
public record ChildRecord(string firstName, string lastName, DateTime dateOfBirth) : BaseRecord(firstName, lastName)
{
public ChildRecord(BaseRecord baseRecord, DateTime dateOfBirth) : this(baseRecord.firstName, baseRecord.lastName, dateOfBirth) { }
};