我有一个使用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 }
在GetType()
上调用_workcontext
将输出
{Name = "AbcWebWorkContext" FullName = "Nop.Web.Framework.AbcWebWorkContext"}
类型层次结构为IWorkContext
(界面)«WebWorkContext
«AbcWebWorkContext
_workContext
被声明为IWorkContext
,Autofac会将实例生成为AbcWebWorkContext
(如上所示)
答案 0 :(得分:3)
new
关键字意味着子类的方法隐藏基类的CurrentCustomer
而不是覆盖,因此WebWorkContext.CurrentCustomer
是一种完全不同于AbcWebWorkContext.CurrentCustomer
的方法}。
您必须将基类的方法声明为
virtual Customer CurrentCustomer { ... }
子类的方法
override Customer CurrentCustomer { ... }
我建议您阅读有关polymorphism in c#的更多信息。
如果您正在使用的方法实际上是在接口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]);
答案 1 :(得分:2)
我不确定我的问题是否正确,但我认为您需要在基类中为方法添加virtual
修饰符,并在子类中为方法添加override
修饰符。
了解有关MSDN
的更多信息