我想让一些事情成为可能。很快,我就有两份文件要打印:
ThirdParty的基本模型到目前为止我所做的是:
#region Models
public abstract class ThirdParty
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class Student : ThirdParty
{ public DateTime Birthday { get; set; } }
public class Worker : ThirdParty
{ public string Company { get; set; } }
#endregion
#region ViewModels
public abstract class BaseViewModel<T> where T : ThirdParty
{
public T Model { get; set; }
public DateTime SelectedDate { get; set; }
public CultureInfo SelectedCulture { get; set; }
}
public class StudentViewModel : BaseViewModel<Student>
{ public string SchoolInput { get; set; } }
public class WorkerViewModel : BaseViewModel<Worker>
{ public string JobInput { get; set; } }
#endregion
#region Document
public abstract class Document<T>
where T : BaseDocumentViewModel
{
public string Template { get; protected set; }
public string FileName { get; protected set; }
public T DocumentViewModel { get; protected set; }
}
public class StudentDocument : Document<StudentDocumentViewModel>
{
public StudentDocument()
{
Template = "student.docx";
FileName = $"{DocumentViewModel.BaseViewModel.Model.FirstName} {DocumentViewModel.BaseViewModel.Model.LastName}";
}
}
public class WorkerDocument : Document<WorkerDocumentViewModel>
{
public WorkerDocument()
{
Template = "worker.docx";
}
}
#endregion
#region Document ViewModels
public abstract class BaseDocumentViewModel
{
public BaseViewModel<ThirdParty> BaseViewModel { get; set; }
public string PrintingDate { get { return BaseViewModel.SelectedDate.ToString(BaseViewModel.SelectedCulture.DateTimeFormat.ShortDatePattern); } }
}
public class StudentDocumentViewModel : BaseDocumentViewModel
{
public StudentViewModel StudentViewModel { get; set; }
public int Age { get { return DateTime.Now.Year - StudentViewModel.Model.Birthday.Year; } }
}
public class WorkerDocumentViewModel : BaseDocumentViewModel
{
public WorkerViewModel WorkerViewModel { get; set; }
public string Position { get { return $"{WorkerViewModel.Model.Company} - ${WorkerViewModel.JobInput}"; } }
}
#endregion是否有可能简化BaseDocumentViewModel以使其更通用?需要将BaseViewModel描述为一个属性和另一个属性中的专用属性并不是很好。
类似于:
public abstract class BaseDocumentViewModel // What to put here ?
{
public T ViewModel { get; set; }
public string PrintingDate { get { return ViewModel.SelectedDate.ToString(ViewModel.SelectedCulture.DateTimeFormat.ShortDatePattern); } }
}
// How to describe the subclasses ?任何暗示都欢迎。
发布于 2017-04-03 21:33:30
您需要一个具有协变量泛型参数的接口。
例如,IThirdPartyViewModel<out T>。
就像这样:
// Entities
public abstract class ThirdParty
{
}
public class Student : ThirdParty
{
}
public class Worker : ThirdParty
{
}
// View models
public interface IThirdPartyViewModel<out T>
{
}
public abstract class ThirdPartyViewModel<T> : IThirdPartyViewModel<T>
{
}
public class StudentVm : ThirdPartyViewModel<Student>
{
}
public class WorkerVm : ThirdPartyViewModel<Worker>
{
}
public abstract class DocumentViewModel<T> where T : IThirdPartyViewModel<ThirdParty>
{
}
public class StudentDocumentVm : DocumentViewModel<StudentVm>
{
}
public class WorkerDocumentVm : DocumentViewModel<WorkerVm>
{
}https://stackoverflow.com/questions/43192302
复制相似问题