Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用dynamic从基类调用受子级保护的方法_C#_C# 4.0_.net 4.5 - Fatal编程技术网

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
的实际类型。但是代码不知道它来自事件源数据库的具体类型。。。当然,我可以做一个案例陈述或使用反思,但有更好的方法吗?