C# 我可以简化我的课程,让它们更枯燥吗?

C# 我可以简化我的课程,让它们更枯燥吗?,c#,C#,我有如下ViewModel类: public class ReferenceDetailsViewModel { public ReferenceDetailsViewModel() { this.Timer = new List<long>(); } public IEnumerable<Reference.Grid> Grid { get; set; } public List<long> Timer { g

我有如下ViewModel类:

public class ReferenceDetailsViewModel
{
    public ReferenceDetailsViewModel() {
        this.Timer = new List<long>();
    }
    public IEnumerable<Reference.Grid> Grid { get; set; }
    public List<long> Timer { get; set; }
}

public class ContentDetailsViewModel
{
    public ContentDetailsViewModel() {
        this.Timer = new List<long>();
    }
    public IEnumerable<Content.Grid> Detail { get; set; }
    public SelectList Statuses { get; set; }
    public SelectList Types { get; set; }
    public List<long> Timer { get; set; }
}
public类引用了etailsviewmodel
{
公共引用的细节视图模型(){
this.Timer=新列表();
}
公共IEnumerable网格{get;set;}
公共列表计时器{get;set;}
}
公共类ContentDetailsViewModel
{
公共内容详细信息viewmodel(){
this.Timer=新列表();
}
公共IEnumerable详细信息{get;set;}
公共选择列表状态{get;set;}
公共选择列表类型{get;set;}
公共列表计时器{get;set;}
}
它们都有一个共同的计时器字段,该字段在构造函数中初始化


是否有一种方法可以创建baseViewModel并让它们继承Timer字段,从而避免为每个具有计时器的ViewModel编码相同的内容?

是的,编码一个抽象类并使具体类继承自此

public abstract class BaseDetailsViewModel
{
    protected BaseDetailsViewModel() {
        Timer = new List<long>();
    }
    public List<long> Timer { get; set; }
}
公共抽象类BaseDetailsViewModel
{
受保护的BaseDetailsViewModel(){
计时器=新列表();
}
公共列表计时器{get;set;}
}

是的,编写一个抽象类的代码,并使具体类从此类继承

public abstract class BaseDetailsViewModel
{
    protected BaseDetailsViewModel() {
        Timer = new List<long>();
    }
    public List<long> Timer { get; set; }
}
公共抽象类BaseDetailsViewModel
{
受保护的BaseDetailsViewModel(){
计时器=新列表();
}
公共列表计时器{get;set;}
}

如果我理解正确,您可以执行以下操作:

public abstract class DetailViewModelBase
{
    protected DetailViewModelBase()
    {
        Timer = new List<long>();
    }

    public List<long> Timer { get; set; }
}

public class ReferenceDetailsViewModel : DetailViewModelBase
{
    public IEnumerable<Reference.Grid> Grid { get; set; }
}


public class ContentDetailViewModel : DetailViewModelBase
{
    public IEnumerable<Content.Grid> Detail { get; set; }
    public SelectList Statuses { get; set; }
    public SelectList Types { get; set; }

}
公共抽象类DetailViewModelBase
{
受保护的DetailViewModelBase()
{
计时器=新列表();
}
公共列表计时器{get;set;}
}
公共类引用的详细视图模型:DetailViewModelBase
{
公共IEnumerable网格{get;set;}
}
公共类ContentDetailViewModel:DetailViewModelBase
{
公共IEnumerable详细信息{get;set;}
公共选择列表状态{get;set;}
公共选择列表类型{get;set;}
}
使用“DetailViewModelBase”作为包含“计时器”的ViewModels的基类


尊敬的,C#er

如果我理解正确,您可以执行以下操作:

public abstract class DetailViewModelBase
{
    protected DetailViewModelBase()
    {
        Timer = new List<long>();
    }

    public List<long> Timer { get; set; }
}

public class ReferenceDetailsViewModel : DetailViewModelBase
{
    public IEnumerable<Reference.Grid> Grid { get; set; }
}


public class ContentDetailViewModel : DetailViewModelBase
{
    public IEnumerable<Content.Grid> Detail { get; set; }
    public SelectList Statuses { get; set; }
    public SelectList Types { get; set; }

}
公共抽象类DetailViewModelBase
{
受保护的DetailViewModelBase()
{
计时器=新列表();
}
公共列表计时器{get;set;}
}
公共类引用的详细视图模型:DetailViewModelBase
{
公共IEnumerable网格{get;set;}
}
公共类ContentDetailViewModel:DetailViewModelBase
{
公共IEnumerable详细信息{get;set;}
公共选择列表状态{get;set;}
公共选择列表类型{get;set;}
}
使用“DetailViewModelBase”作为包含“计时器”的ViewModels的基类


关于,C#er

如果您可以从
Reference.Grid
Content.Grid
提取一个通用的
IGrid
接口,您可能会得到

public abstract class GridViewModel<TGrid> where T : IGrid {
    protected GridViewModel() {
        Timer = new List<long>();
    }

    public List<long> Timer { get; set; }
    public IEnumerable<TGrid> Details { get; set; }
}

public class ReferenceDetailsViewModel : GridViewModel<Reference.Grid> { 

}

public class ContentDetailsViewModel : GridViewModel<Content.Grid> {
    public SelectList Statuses { get; set; }
    public SelectList Types { get; set; }
    public List<long> Timer { get; set; }
}
公共抽象类GridViewModel,其中T:IGrid{
受保护的GridViewModel(){
计时器=新列表();
}
公共列表计时器{get;set;}
公共IEnumerable详细信息{get;set;}
}
公共类引用的详细视图模型:GridViewModel{
}
公共类ContentDetailsViewModel:GridViewModel{
公共选择列表状态{get;set;}
公共选择列表类型{get;set;}
公共列表计时器{get;set;}
}

我假设您可以将
ReferenceDetailsViewModel.Grid
重命名为
ReferenceDetailsViewModel.Details

,如果您可以从
Reference.Grid
Content.Grid
提取一个通用的
IGrid
接口,您可能会得到

public abstract class GridViewModel<TGrid> where T : IGrid {
    protected GridViewModel() {
        Timer = new List<long>();
    }

    public List<long> Timer { get; set; }
    public IEnumerable<TGrid> Details { get; set; }
}

public class ReferenceDetailsViewModel : GridViewModel<Reference.Grid> { 

}

public class ContentDetailsViewModel : GridViewModel<Content.Grid> {
    public SelectList Statuses { get; set; }
    public SelectList Types { get; set; }
    public List<long> Timer { get; set; }
}
公共抽象类GridViewModel,其中T:IGrid{
受保护的GridViewModel(){
计时器=新列表();
}
公共列表计时器{get;set;}
公共IEnumerable详细信息{get;set;}
}
公共类引用的详细视图模型:GridViewModel{
}
公共类ContentDetailsViewModel:GridViewModel{
公共选择列表状态{get;set;}
公共选择列表类型{get;set;}
公共列表计时器{get;set;}
}

我假设您可以将
ReferenceDetailsViewModel.Grid
重命名为
ReferenceDetailsViewModel.Details

这可能更适合代码审阅堆栈交换:为什么您不能拥有一个视图模型继承自的
抽象类ViewModel
上课?如果您发布的代码是真实的,那么您可以将共享功能丢弃到抽象基类中。这真的是您仅有的共享代码吗?如果是这样的话,试图改变它可能会以更多的工作结束。如果这只是一个例子,或者有更多的类,或者更多的工作实际上是共享的,那么这可能是值得努力的。我有很多使用计时器的类,所以我想这会使它更简单。这可能更适合代码复查stackexchange:为什么不能有一个视图模型继承自的抽象类ViewModel?为什么不能只插入基类?如果您发布的代码是真实的,那么您可以将共享功能丢弃到抽象基类中。这真的是您仅有的共享代码吗?如果是这样的话,试图改变它可能会以更多的工作结束。如果这只是一个例子,或者有更多的类,或者更多的工作实际上是共享的,那么这可能是值得努力的。我有很多使用计时器的类,所以我想这会使它更容易。在我看来,如果在抽象类
受保护的
上而不是
公共的
上创建构造函数,就不会那么混乱了。(当然也可以使用
内部
,但这限制了访问。)@Alessandro-你同意Jeppe的观点吗?谢谢你是对的。。。复制并替换打字错误!是的,杰玛,我同意!我之前的回答是正确的,但设计很糟糕!:)在我看来,我不那么困惑