0
できるだけ一般的なものを作りたい。 まもなく、Iプリントに2つの文書ました:ジェネリッククラスのジェネリッククラスを作成する
- すべてのビューモデルは、そのユーザを完了します
ThirdParty
- という名前のベースモデルを持っている入力は、前だから私は」何を印刷
を起動しますこれまでのVEのです:
#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
を1つのプロパティと特殊なプロパティに記述する必要があるとは思われません。以下のような
何か:
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 ?
任意のヒントは大歓迎です。
そこに行くのが多すぎる継承、私見:このような
何か。 –
私はあなたのクラスで迷子になってしまったのですが、 'class BaseDocumentViewModelなぜではありませんか?T:ThirdParty {BaseViewModel BaseViewModel {get;セット; } '?子クラスは 'class StudentDocumentViewModel:BaseDocumentViewModel ' –
Evk