2012-12-06 38 views
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没有让子进行调度。

​​

编辑现在我使用这个在孩子(和作出的抽象父)的作品,但它丑陋的ID,而实施者不用担心调度。

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

回答

0

你应该定义你的基类有两种方法签名abstractvirtual,例如。

protected abstract void Apply(Message1 message); 

使用virtual如果要定义你的基类的实现,不必(但可以),在子类中重写。

在你的子类,你会忽略它是这样:

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

而且,在你的榜样,该方法InternalChange试图调用ApplyDomainEvent类型的参数,但是,在这两个你重载它们接受Message1Message2的任一种类型。如果它编译完成,无论如何你都会得到运行时错误,因为.NET动态运行时将无法找到与参数相匹配的适当方法。

至于使用动态,我认为这是没有必要的问题。

+0

Message1和Message2是DomainEvent类型,这是我需要的棘手部分运行时通过动态投射/重载...这也是为什么我不能将抽象方法放在基类中,因为我不知道参数实现者将使用。 – user1496062

+0

如果'Message1'和'Message2'继承自'DomainEvent',则不能上传该方向。我建议你使用关键字'as'来确定发送到'InternalChange'的实际类型。 – Matthew

+0

但是代码并不知道它来自事件源DB的具体类型......当然,我可以创建一个case语句或使用反射,但有没有更好的方法? – user1496062

0

逻辑是有点......倒过来。我不明白一两件事:哪些类正在调用apply,基类型还是子类型?如何识别儿童课程以发送活动?你不能渲染应用虚拟保护,并将它留在基类中为空吗?

相关问题