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のコアにあるため、変更できません。変更したくありません。

メソッドを隠さないのはなぜですか?

メソッドの基本クラス宣言:

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キーワードは、サブクラスのメソッドがオーバーライドする代わりにベースクラスのメソッドを非表示にすることを意味します。したがって、と完全に異なるメソッドです。CurrentCustomerWebWorkContext.CurrentCustomerAbcWebWorkContext.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 に答える