首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建泛型类的泛型类

创建泛型类的泛型类
EN

Stack Overflow用户
提问于 2017-04-03 18:59:40
回答 1查看 59关注 0票数 0

我想让一些事情成为可能。很快,我就有两份文件要打印:

  • 所有这些都有一个名为ThirdParty的基本模型
  • 视图模型将完成用户在启动打印之前输入的内容。

到目前为止我所做的是:

代码语言:javascript
复制
#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描述为一个属性和另一个属性中的专用属性并不是很好。

类似于:

代码语言:javascript
复制
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 ?

任何暗示都欢迎。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-03 21:33:30

您需要一个具有协变量泛型参数的接口。

例如,IThirdPartyViewModel<out T>

就像这样:

代码语言:javascript
复制
// 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>
{
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43192302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档