C# 如何使用dynamic从基类调用受子级保护的方法
得到以下代码C# 如何使用dynamic从基类调用受子级保护的方法,c#,c#-4.0,.net-4.5,C#,C# 4.0,.net 4.5,得到以下代码 protected virtual void InternalChange(DomainEvent @event) { ((dynamic) this).Apply(@event); } 子对象通过许多字段实现处理事件的逻辑,例如 protected Apply ( Message1 message) { } protected Apply ( Message2 message) { } 但是,这会给出一个错误,表示它不可访问。我试过了,但运气
protected virtual void InternalChange(DomainEvent @event)
{
((dynamic) this).Apply(@event);
}
子对象通过许多字段实现处理事件的逻辑,例如
protected Apply ( Message1 message)
{
}
protected Apply ( Message2 message)
{
}
但是,这会给出一个错误,表示它不可访问。我试过了,但运气不好
有什么想法吗。。希望没有像这样的反思。(例如)
更多信息我可以将InternalChange移动到子类,但我宁愿不让子类执行分派
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);
}
例如,您应该将基类定义为在方法签名上具有
抽象
或虚拟
protected abstract void Apply(Message1 message);
如果要在基类中定义不必(但可以)在子类中重写的实现,请使用virtual
在您的子类中,您可以这样重写它:
protected override void Apply(Message1 message)
{
// code here
}
另外,在您的示例中,InternalChange
方法试图使用类型为DomainEvent
的参数调用Apply
,但是,在Apply
的两个重载中,它们都接受Message1
或Message2
的任何一种类型。如果它确实编译了,您将得到一个运行时错误,因为.NET动态运行时无法找到与参数匹配的适当方法
至于使用动态,我认为没有必要解决手头的问题。逻辑有点。。。颠倒的。我不明白一两件事:什么类在调用apply,基类型还是子类型?如何识别要发送事件的子类?您不能在基类中呈现Apply virtual protected并将其保留为空吗?Message1和Message2属于DomainEvent类型,这是我需要通过动态执行运行时强制转换/重载的棘手部分。。。这也是为什么我不能将抽象方法放在基类中,因为我不知道实现者将使用哪些参数。如果
Message1
和Message2
继承自DomainEvent
,则无法隐式地向上转换该方向。我建议您使用关键字as
来确定发送到InternalChange
的实际类型。但是代码不知道它来自事件源数据库的具体类型。。。当然,我可以做一个案例陈述或使用反思,但有更好的方法吗?