gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:05:56 26 4
gpt4 key购买 nike

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

if (viewModel == null)
{
return HttpNotFound();
}
return View(viewModel);

我的想法是我想要一个名为 ViewModelResult() 的扩展方法来处理这个问题,以便它返回 ActionResultHttpNotFound 结果取决于 View 模型是否可用。这样我就不用每次都写这3-4行代码了。

但是,似乎 MVC Controller 中方法 View()HttpNotFound() 的保护级别导致了一些严重的问题。我已经编写了如下代码,但它不起作用:

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

它会抛出诸如“System.Web.MVC.Controller.View() 由于其保护级别而无法访问”之类的错误消息。这让我感到困惑,我认为在扩展方法中,由 this 关键字标记的对象的所有私有(private)和 protected 方法都是可访问的,就像您在此类中编写方法一样。但事实证明我错了,那些非公共(public)方法在扩展方法中是不可访问的。

现在的问题是,我该如何解决这个问题?我有点无能为力,不知道我能做些什么。 MVC Controller 类来自 .NET 框架,我无法修改源代码。不建议更改 .NET 框架的内部实现。谁能帮忙?在这种情况下,您建议我做什么?

最佳答案

您可以创建 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);
}
}

关于C# 扩展方法和保护级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29965527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com