1

我有一个使用 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's core 中,我不想更改。

为什么不隐藏方法?

方法的基类声明:

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(如上所示)

4

2 回答 2

3

new关键字意味着子类的方法隐藏基类CurrentCustomer而不是覆盖,所以WebWorkContext.CurrentCustomer是一个完全不同的方法AbcWebWorkContext.CurrentCustomer

您必须将基类的方法声明为

virtual Customer CurrentCustomer { ... }

以及子类的方法

override Customer CurrentCustomer { ... }

我建议您阅读有关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]);
于 2013-03-14T02:37:22.250 回答
2

我不确定我的问题是否正确,但我认为您需要为virtual基类中的方法添加override修饰符,并为子类中的方法添加修饰符。

在MSDN上了解更多信息

于 2013-03-14T02:37:15.837 回答