C#扩展方法和保护级别?

Lor*_*ill 1 c# asp.net asp.net-mvc controller asp.net-mvc-5

我正在尝试为MVC控制器类编写扩展方法,因为我在程序中反复看到这样的代码:

if (viewModel == null)
{
    return HttpNotFound();
}
return View(viewModel);
Run Code Online (Sandbox Code Playgroud)

我的想法是,我想要一个调用的扩展方法ViewModelResult()来处理这个问题,因此它将返回一个ActionResult或一个HttpNotFound结果,具体取决于视图模型是否可用.这样,我不必每次都写这3-4行代码.

但是,似乎方法View()HttpNotFound()MVC控制器的保护级别造成了一些严重的麻烦.我已经编写了如下代码,但它不起作用:

public static class ExtensionController
{
    public static ActionResult ViewModelResult(this Controller controller, ViewModel viewModel)
    {
        if (viewModel == null)
        {
            return controller.HttpNotFound();
        }
        return controller.View(viewModel);
    }
}
Run Code Online (Sandbox Code Playgroud)

它抛出错误消息,例如"System.Web.MVC.Controller.View()由于其保护级别而无法访问".这让我感到困惑,我认为在扩展方法中,this关键字标记的对象的所有私有和受保护方法都是可访问的,就像在此类中编写方法一样.但我被证明是错误的,那些非公开的方法在扩展方法中是不可访问的.

现在问题是,我怎样才能解决这个问题?我有点无能,不知道我能做些什么.MVC控制器类在.NET框架内,我无法修改源代码.不建议不要改变.NET框架的内部实现.有人可以帮忙吗?在这种情况下,你建议我做什么?

Mar*_*rot 5

您可以创建Controller该类的子类并为其添加方法.

public abstract class ControllerBase : Controller
{
    protected ActionResult ViewModelResult(ViewModel viewModel)
    {
        if (viewModel == null)
        {
            return HttpNotFound();
        }
        return View(viewModel);
    }
}

public class ValuesController : ControllerBase
{
    public ActionResult Index()
    {
        var vm = ...;
        return ViewModelResult(vm);
    }
}
Run Code Online (Sandbox Code Playgroud)