我正在使用VSExpress for Web。
public class BaseClass
{
public virtual String Method1()
{
return "Base class overridable Method 1";
}
public String Method2()
{
return "Base class hideable Method 2";
}
}
public class DerivedClass : BaseClass
{
public override String Method1()
{
return "Derived class overriden Method 1";
}
public new String Method2()
{
return "Derived class hidden Method 2";
}
}
在控制器中运行方法2时
public class HomeController : Controller
{
// GET: Home
public String Index()
{
BaseClass isDefinitelyBase = new BaseClass();
BaseClass isReallyChild = new DerivedClass();
DerivedClass isDefinitelyChild = new DerivedClass();
return isReallyChild.Method2();
}
}
输出
“基类隐藏方法2”
当对象放在Viewbag中并发送到View时,该方法被覆盖
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
BaseClass isDefinitelyBase = new BaseClass();
BaseClass isReallyChild = new DerivedClass();
DerivedClass isDefinitelyChild = new DerivedClass();
ViewBag.ReallyChild = isReallyChild;
return View();
}
@ViewBag.ReallyChild.Method2();
输出是:
“派生类隐藏方法2”
答案 0 :(得分:1)
这里的原因是ViewBag是一个动态变量,它只知道实际类型是什么,它不知道你是从基类型中分配的。
所以在视图中,它只知道它是派生类型,除非你明确地将它转换为基类型,这将为你提供基本的隐藏方法。顺便说一句,这不是“被覆盖的”。 Overriden意味着它是虚拟的,并且调用base作为基类型获得派生类型。这不是正在发生的事情..你将实例称为派生类型,因为动态不知道任何不同。
答案 1 :(得分:0)
更改
BaseClass isReallyChild = new DerivedClass();
要
var isReallyChild = new DerivedClass();
ViewBag
在运行时和编译时设置类型。获得基类方法的原因是因为类型仍然是基类。
要从ViewBag获取基础,请尝试:
var base = (BaseClass)ViewBag.ReallyChild;
var res = base.Method2();