我有一个项目使用 Autofac 来实例化对象
builder.RegisterType<AbcWebWorkContext>().As<IWorkContext>().InstancePerHttpRequest();
这个 AbcWebWorkContext
是 WebWorkContext
的子类:
public partial class AbcWebWorkContext : WebWorkContext
在我的 AbcWebWorkContext
中,我想对父类隐藏一个方法和一个属性
protected new Customer GetCurrentCustomer(){ //do stuff }
new public Customer CurrentCustomer { //do studd }
但是当有人打电话
_workContext.CurrentCustomer
基类属性被调用。如果我这样调用它
((AbcWebWorkContext) _workContext).CurrentCustomer
有效。
我想知道为什么我无法隐藏父方法。
我无法更改调用的类,因为它在 NopCommerce
的核心中,我不想更改它。
为什么不隐藏方法?
方法的基类声明:
protected Customer GetCurrentCustomer() { // do stuff }
public Customer CurrentCustomer{ // do stuff }
在 _workcontext
上调用 GetType()
将输出
{Name = "AbcWebWorkContext" FullName = "Nop.Web.Framework.AbcWebWorkContext"}
类型层次是IWorkContext
(接口(interface))« WebWorkContext
« AbcWebWorkContext
_workContext
声明为 IWorkContext
,Autofac 生成一个实例为 AbcWebWorkContext
(如上所示)
最佳答案
new
关键字意味着子类的方法隐藏基类的CurrentCustomer
而不是覆盖,所以WebWorkContext.CurrentCustomer
是一个与AbcWebWorkContext完全不同的方法。当前客户
。
您必须将基类的方法声明为
virtual Customer CurrentCustomer { ... }
以及子类的方法
override Customer CurrentCustomer { ... }
我建议您阅读更多关于 polymorphism in c# 的内容.
如果您使用的方法实际上是在一个接口(interface) IWebWorkContext
中定义的,您只需封装基类而不是从它继承,如下所示:
class AbcWebWorkContext : IWebWorkContext
{
private WebWorkerContext _inner = new WebWorkerContext();
public Customer CurrentCustomer { ... }
}
如果你不能使基类的方法成为虚拟的,你必须做一些不太优雅的事情,比如反射:
var prop = _workContext.GetType().GetProperty("CurrentCustomer");
var value = (Customer)prop.GetValue(_workContext, new object[0]);
关于c# - 为什么我的继承类没有隐藏我的基类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15400134/