2017-09-19 10 views
2

나는 닷넷에서 다이나믹 디스패치를 ​​사용하여 과거에는 이벤트 원동력을 사용했다. 예를 들어에 대한 접근 방식을 볼 수 있습니다. 한마디로 this article from 2009닷넷 표준 1.4의 다이나믹 디스패치

, 당신은 몇 가지 다른 클래스는 단지 Event의 열거를 취할 수

public class QuestionAsked : Event {} 
public class QuestionAnswered : Event {} 

public class Event {} 

특정 이벤트가 그들에게

// snip 

public void Apply(IEnumerable<Event> events) => events.ToList().ForEach(Apply); 

public void Apply(Event ev) => ((dynamic) this).Apply((dynamic) ev); 

private void Apply(QuestionAnswered qa) { 
//something 
} 
// end snip 
을 적용 할 기본 이벤트 유형을 가지고

이 클래스는 Apply을 충족 할 필요가 없습니다. 각 유형에 대한 hod. 걱정하지 않는 이벤트는 무시됩니다.

난 그냥 .NetStandard 1.4을 사용하여 같은 일을 시도하고 나는 개인 Apply 방법이되지 않은 유형을 적용하려고하면 나는 StackOverflowException

동적 파견 사이에 변경했습니다 얻을. Net 4.5.x 및 .Net (Core | Standard)? 이 방법을 더 이상 사용할 수 없습니까? 내가 분명히 뭔가를 가미하여 해요 -

+0

.NET 표준 라이브러리 형식 인 .NET Framework 또는 .NET Core 호스트 응용 프로그램을 사용합니까? 스택 오버플로는 확실히 동적 디스패치 중에 자신을 호출하는 것으로부터 –

+0

어떻게 알 수없는 이벤트에 대해 StackOverflowException을 throw하지 않았는지 궁금합니다. –

+0

.Net 4.5.x 예제를 작성합니다 ... 내가 여기서 일하지 않았다면 100 % 확신 할 수 있었을 것이다. :) –

답변

2

음, 열린 학습의 하나의 단점은 때때로 당신이

나는 닷넷 4.5.x에서 동일한 코드를 시도하고도 실패 : 틀렸어 배울 수 있다는 것입니다 safe 나는이 안전하지 않은 코드로 과거에 사용 해왔다.

그것은

public void Apply(IEnumerable<Event> events) => events.ToList().ForEach(Apply); 

public void Apply(Event ev) 
{ 
    GetType() 
     .GetRuntimeMethods() 
     .Where(mi => mi.IsPrivate) 
     .Where(mi => mi.Name == "Apply") 
     .Where(mi => mi.GetParameters().Length == 1) 
     .SingleOrDefault(mi => mi.GetParameters().SingleOrDefault()?.ParameterType == ev.GetType()) 
     ?.Invoke(this, new[] {ev}); 
} 

내 테스트는 코드로 통과 ... 정말 그렇게 if there is a method called Apply that takes this type as an argument then invoke it 단지 간결한 표현했다. 나는. 메소드가있는 이벤트가 적용되고 무시되지 않는 이벤트가 적용됩니다.

은 분명히 실제 응용 프로그램에서 한 번만 방법을 찾아 각 호출을 확인해야하지만 독자들에게 운동으로 떠날 것이다, 그것은 당신이 경우 달라 지나요 P