C# 使用继承

C# 使用继承,c#,.net,asp.net-mvc,generics,inheritance,C#,.net,Asp.net Mvc,Generics,Inheritance,我目前正在开发一个应用程序,它在一个场景中使用了继承。但现在我有一个任务,需要从模型生成器返回多个viewmodel。我将描述如下: 在我的控制器方法中,我们一直保持它的亮度,并使用模型生成器 public ViewResult Summary(ReportArgs args) { return View<SomeBuilder>(args); } 公共视图结果摘要(ReportArgs args) { 返回视图(args); } 然后点击从基类继承的builder方法

我目前正在开发一个应用程序,它在一个场景中使用了继承。但现在我有一个任务,需要从模型生成器返回多个viewmodel。我将描述如下:

在我的控制器方法中,我们一直保持它的亮度,并使用模型生成器

public ViewResult Summary(ReportArgs args)
{
    return View<SomeBuilder>(args);
}
公共视图结果摘要(ReportArgs args)
{
返回视图(args);
}
然后点击从基类继承的builder方法

public class SomeBuilder : NewBuilder<TaskVM, Task> {}
公共类SomeBuilder:NewBuilder{}
然后,NewBuilder具有以下实现:

public class NewBuilder<TModel, TItem> : ReportBuilder where TModel : SomeReportVM<TItem>, new() where TItem : ReportItem
{
    public override ReportVM Build(ReportArgs args)
    {
       /* Some code to get roles here */               
        return new TModel
        {
            FeedbackModel = FeedbackBuilder.Build(inputGrid.Report.Id),

        };                       
    }
}
公共类NewBuilder:ReportBuilder,其中TModel:SomeReportVM,new(),其中TItem:ReportItem
{
公共重写ReportVM生成(ReportArgs args)
{
/*在此处获取角色的一些代码*/
返回新的TModel
{
FeedbackModel=FeedbackBuilder.Build(inputGrid.Report.Id),
};                       
}
}
我需要做的是从NewBuilder控制器返回一个不同的VM,但是努力找到最好的方法来实现这一点


传入TaskVM时无法返回InvalidVM。只是为了让人们意识到这正被多个视图用于不同的VM,实体类将被传入?

如果它无效,抛出一个错误并将其捕获到流中(例如,在上面的第一个代码块中),然后按照您的意愿呈现无效的视图模型或句柄。这在您的场景中有效吗?

公共类增强构建器:NewBuilder
public class EnhancedBuilder<TModel, TItem, TInvalidModel> : NewBuilder<TModel, TItem>
    where TModel : SomeReportVM<TItem>, new()
    where TItem : ReportItem
    where TInvalidModel : SomeReportVM<TItem>, new() // Made an assumption here.
    // It would likely be wise to create an InvalidVM base class to handle common
    // issues such as roles, and defer the rest to child builders.
{
    public override ReportVM Build(ReportArgs args)
    {
       /* Some code to get roles here */   

        if( ** validation code fails ** ) 
        {
            return new TInvalidModel
            {
            }
        }

        return new TModel
        {
            FeedbackModel = FeedbackBuilder.Build(inputGrid.Report.Id),

        };                       
    }
}
其中TModel:SomeReportVM,new() 其中TItem:ReportItem 其中TInvalidModel:SomeReportVM,new()//在这里做了一个假设。 //创建InvalidVM基类来处理公共事务可能是明智的 //角色等问题,并将其余问题推迟到子构建器。 { 公共重写ReportVM生成(ReportArgs args) { /*在此处获取角色的一些代码*/ 如果(**验证代码失败**) { 返回新的TInvalidModel { } } 返回新的TModel { FeedbackModel=FeedbackBuilder.Build(inputGrid.Report.Id), }; } }
然后你的SomeBuilder看起来会有点不同

public class SomeBuilder<TInvalidVM> : NewBuilder<TaskVM, Task, TInvalidVM>
    where TInvalidVM : SomeReportVM<TItem>, new()
{
}
公共类SomeBuilder:NewBuilder
其中TInvalidVM:SomeReportVM,new()
{
}
最后称之为:

public ViewResult Summary(ReportArgs args)
{
    return View<SomeBuilder<MyInvalidVM>>(args);
}
公共视图结果摘要(ReportArgs args)
{
返回视图(args);
}

那么您想将“TaskVM”更改为其他内容吗?那么在您的上下文中VM是什么呢?不确定我是否理解正确-您的意思是
NewBuilder
的实例应该返回除
TaskVM
之外的其他内容(可能是继承自
TaskVM
)Hi Ivalyo关于您的注释,我需要返回不同的VM(ViewModel)。在我的例子中,它将是一个名为InvalidVM的viewmodel。因此,在我看来,我可以使用DisplayFor()并创建相关的显示模板。假设
ReportBuilder
属于
NewBuilder
类型,那么您似乎在尝试组合某种多重继承,
NewBuilder
的实例同时是
ReportBuilder
NewBuilder
。这是行不通的。答案是看如何实现接口,而不是继承基类。谢谢Keith。你说得对。这是在我处理应用程序之前实现的。但我明白为什么它是用多重继承来完成的。现在需求已经改变,所以我们需要检查一些授权规则,并返回一个invalidVM,然后返回一个带有相关受限消息的视图给用户。