2012-12-06 2 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는 디스패치를 ​​수행하는 자식이 없습니다.

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); 
    } 

답변

0

당신은 예를 들어, 메서드 서명에 하나 abstract 또는 virtual을 위해 기본 클래스를 정의해야합니다.

protected abstract void Apply(Message1 message); 

사용 virtual 당신이없는 (그러나 수) 하위 클래스에서 재정의 할 수 귀하의 기본 클래스 구현을 정의하려면. 서브 클래스에서

, 당신은 같은 재정의합니다 :

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

또한, 귀하의 예제에서, 방법 InternalChange은 모두 당신의 과부하에, 그러나, 유형 DomainEvent의 인수 Apply를 호출하려고 Apply의 경우 Message1 또는 Message2 중 하나를 사용할 수 있습니다. .NET 동적 런타임이 인수와 일치하는 적절한 메소드를 찾을 수 없으므로 컴파일 할 경우 런타임 오류가 발생합니다.

다이내믹을 사용하는 것은 당면의 문제로 불필요하다고 생각합니다.

+0

Message1과 Message2는 DynamicEvent를 통해 런타임 캐스팅/오버로딩을 필요로하는 까다로운 부분인데, 구현자가 사용하는 매개 변수를 알지 못하는 이유는 기본 클래스에 추상 메서드를 넣을 수없는 이유입니다. – user1496062

+0

'Message1'과'Message2'가'DomainEvent'에서 상속받은 경우, 그 방향을 함축적으로 업 캐스트 할 수 없습니다. 'InternalChange'로 보내지는 실제 타입을 결정하기 위해'as '키워드를 사용할 것을 권합니다. – Matthew

+0

하지만 코드는 이벤트 소스 DB에서 제공되는 구체적인 유형을 알지 못합니다 ... 물론 케이스 문을 만들거나 반사를 사용할 수 있지만 더 좋은 방법이 있습니까? – user1496062

0

논리가 일종의 ... 반전 됨. 하나 또는 두 가지를 이해하지 못합니다. 어떤 클래스가 적용되는지, 기본 유형 또는 하위 유형인지 이해하지 못합니까? 이벤트를 보내는 어린이 수업의 분별력은 어떻게 발생합니까? 가상 보호 적용을 렌더링하고 기본 클래스에서 비워 두지 않았습니까?