0

次のコードを取得しました

 protected virtual void InternalChange(DomainEvent @event)
 {
       ((dynamic) this).Apply(@event);
 }

子オブジェクトは、いくつかのフィールドを介してイベントを処理するロジックを実装します。

 protected Apply ( Message1 message)
 {

 }
protected Apply ( Message2 message)
 {

 }

ただし、これにより、アクセスできないというエラーが発生します。私は仮想を試しましたが、運がありませんでした。

何か案は ?..うまくいけば、この方法のように反射することなく。(例: http: //blogs.msdn.com/b/davidebb/archive/2010/01/18/use-c-4-0-dynamic-to-drastically-simplify-your-private-reflection-code.aspx

詳細情報InternalChangeを子クラスに移動できますが、idは子にディスパッチを実行させません。

   void Apply(AggregateRootHandlerThatMeetsConventionEvent domainEvent)
    {
        OnAggregateRootPrivateHandlerThatMeetsConventionCalled = true;
    }


    void Apply(AggregateRootPrivateHandlerThatMeetsConventionEvent domainEvent)
    {
        OnAggregateRootPrivateHandlerThatMeetsConventionCalled = true;
    }

    void Apply(AggregateRootProtectedHandlerThatMeetsConventionEvent domainEvent)
    {
        OnAggregateRootProtectedHandlerThatMeetsConventionCalled = true;
    }


    protected override void InternalChange(DomainEvent @event)
    {

        Apply(((dynamic)@event));
    }

今のところ編集して、これを子で使用しています(そして親を抽象化しました)。これは機能しますが、その醜いIDは、実装者がディスパッチについて心配する必要はありません。

    protected void Handle(DomainEvent message)
    {
        Handle ( (dynamic) message);
    }
4

2 に答える 2

0

You should define your base class to have either abstract or virtual on the method signature, for instance.

protected abstract void Apply(Message1 message);

Use virtual if you want to define an implementation in your base class that doesn't have to (but can) be overridden in the child class.

In your subclass, you would override it as such:

protected override void Apply(Message1 message)
{
    // code here
}

Also, in your example, the method InternalChange is trying to call Apply with an argument of type DomainEvent, however, in both your overloads for Apply, they accept either type of Message1 or Message2. If it did compile, you would get a run time error anyway because the .NET dynamic run time would not be able to find an appropriate method that matches the argument.

As for using dynamic, I think it is unnecessary for the problem at hand.

于 2012-12-06T04:19:24.870 に答える
0

論理は一種の...逆です。1 つまたは 2 つのことを理解できません。apply を呼び出しているクラスはどれですか。基本型ですか、それとも子型ですか。イベントを送信する子クラスの識別はどのように行われますか? Apply virtual protected をレンダリングして、基本クラスで空のままにすることはできませんか?

于 2013-01-04T15:33:52.100 に答える