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-drastical-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

例如,您应该将基类定义为具有abstractvirtual在方法签名上。

protected abstract void Apply(Message1 message);

如果virtual您想在您的基类中定义一个不必(但可以)在子类中覆盖的实现,请使用此选项。

在您的子类中,您可以这样覆盖它:

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

此外,在您的示例中,该方法InternalChange尝试Apply使用 type 的参数进行调用DomainEvent,但是,在您的两个重载 for 中Apply,它们都接受Message1or类型Message2。如果它确实编译了,那么无论如何您都会收到运行时错误,因为 .NET 动态运行时将无法找到与参数匹配的适当方法。

至于使用动态,我认为对于手头的问题是不必要的。

于 2012-12-06T04:19:24.870 回答
0

逻辑有点……颠倒了。我不明白一两件事:什么类调用应用,基类型或子类型?子类发送事件的识别是如何发生的?你不能渲染 Apply virtual protected 并在基类中将其留空吗?

于 2013-01-04T15:33:52.100 回答