Я уже сломал голову над этим. Итак, вот ситуация. У меня есть два типа документов с похожими свойствами. Свойства высокого уровня (базового уровня) (Имя, Дата) требуются в одном месте, «Строки» необходимы для создания конкретного c документа для отправки в другую систему. Как это реализовано сейчас:
Классы данных:
public abstract class BaseDocument
{
public string Name { get; set; }
public DateTime Date { get; set; }
}
public abstract class BaseDocument<TRowType> : BaseDocument
{
public abstract List<TRowType> Rows { get; set; }
}
public class DocumentTypeOne : BaseDocument<RowTypeOne>
{
public override List<RowTypeOne> Rows { get; set; }
}
public class DocumentTypeTwo : BaseDocument<RowTypeTwo>
{
public override List<RowTypeTwo> Rows { get; set; }
}
public class RowTypeOne
{
public int Cost { get; set; }
}
public class RowTypeTwo
{
public int Change { get; set; }
}
ProcessorClass:
public class DocumentsProcessor
{
public void ProcessDocument(BaseDocument doc)
{
switch (doc)
{
case DocumentTypeOne t1:
ProcessDocumentTypeOne((DocumentTypeOne)doc);
break;
case DocumentTypeTwo t2:
ProcessDocumentsTypeTwo((DocumentTypeTwo)doc);
break;
default:
throw new ArgumentException($"Unhandled type {nameof(doc)}");
}
}
public void ProcessDocumentTypeOne(DocumentTypeOne docOne)
{
// specific actions
}
public void ProcessDocumentsTypeTwo(DocumentTypeTwo docTwo)
{
// other specific actions
}
}
Я знаю, что уныние - это не хорошо. Но я понятия не имею, как это изменить. Я могу создать базовый класс с параметром generi c, но тогда я потеряю способность работать только со свойствами базового уровня. И для этого потребуется переписать класс, возвращающий List. Какой способ решить это? И нужно ли это решать?