2008-11-06 3 views
13

Microsoft는 응용 프로그램에서 이벤트 구독 및 게시를 처리하기 위해 Microsoft.Practices.CompositeUI.EventBroker를 사용하고 있습니다. 런타임시 메서드에 특성을 추가하려면 어떻게합니까?

[EventPublication("example", PublicationScope.Global)] 
public event EventHandler Example; 

다음 당신은 당신의 핸들러에 다른 속성을 추가, 동일한 주제의 이름으로, 다음과 같이 :이 같은 주제의 이름을 지정, 이벤트에 속성을 추가하는 것이 작동하는 방법은

[EventSubscription("example", ThreadOption.Publisher)] 
public void OnExample(object sender, EventArgs e) 
{ 
    ... 
} 

그런 다음 모든 것을 일치시키는 EventInspector에 객체를 전달합니다.

이 코드를 디버그해야하므로 모두 이벤트를 구독하는 디버그 클래스를 만들려고합니다. 모든 주제 이름 목록을 얻을 수 있지만 런타임에만. 따라서 EventInspector에 디버그 객체를 전달하기 전에 런타임에 메서드에 속성을 추가 할 수 있어야합니다.

런타임시 메서드에 특성을 추가하려면 어떻게합니까?

+0

: 우리는 당신이 정확히 짓을하는 방법을 알려 주시기 바랍니다 : D –

답변

9

달성하려는 것은 상당히 복잡하므로 시작하기 위해 뭔가를 제공하려고 노력할 것입니다. 이것은 당신이 뭔가를 달성하기 위해 결합 할 필요가 생각하는 것입니다 :

  1. event의 모든 구성원을 검색하는 방법 Search으로, 추상 클래스 AbstractEventDebugger 정의를하고 EventInspector로 등록합니다. 또한 호출 한 이벤트를 식별 할 수있는 IdentifyEvent 메서드를 정의하십시오 (이것은 사용자에 따라 달라지며 매개 변수에는 어떤 것이 있는지 등).
  2. TypeBuilder (표시된 설명은 here)을 사용하여 dynamic type을 정의하고 클래스에서 상속받습니다. 이 클래스는 debugger 객체의 클래스입니다.
  3. CustomAttributeBuilder 클래스 (here 참조)를 사용하여 핸들러에
  4. Reflection.Emit 속성을 부모 클래스에서 IdentifyEvent 메소드를 호출 할 것이다 (here 참조) Reflection.Emit.MethodBuilder를 사용하여 클래스에 핸들러를 연결합니다.
  5. dynamic 클래스의 인스턴스를 만들어 EventInspector로 보냅니다. 최대 :)

Here

  • 화재는 (사실은 고전에 "Hello World"이다) 뭔가를 호출하는 방법을 만드는 방법에 대한 샘플입니다.

    잘 수행하려면 많은 조정이 필요하지만 리플렉션에 대해 많은 것을 배웁니다.

    행운을 빈다.

  • +0

    +1은 실제 해결책을 제시하고 "완료 할 수 없습니다". 감사 – Nuzzolilo

    3

    속성은 컴파일 타임 기능입니다 (ComponentModel을 다루지 않는 한 - 리플렉션을 사용하고있는 것으로 생각됩니다). 따라서 런타임에 속성을 추가 할 수 없습니다. "런타임에 형식에 추가 메서드를 추가하는 방법"과 비슷한 질문이 될 것입니다. 일반 C#/.NET (DLR 이전)에서는 그렇게 할 수 없습니다.

    +0

    를 사실, 그것은 동적 어셈블리 및 일반 어셈블리를 혼합하여 수행 할 수 있습니다. .NET 2.0 그들에 대한 지원이 있으며, 이것을 위해 DLR을 사용할 필요가 없습니다. –

    +3

    @ Bogdan -하지만 여전히 기존 유형/회원에 속성을 추가 할 수는 없습니다. –

    1

    DynamicMethod의 세계를 탐구해야합니다. 그러나 MSIL에 대해 알고 싶으 시다면 아키텍처에 대해 열심히 생각해 보시기 바랍니다.

    +0

    아마도 그의 아키텍처는 런타임에 여러 유형의 서비스를 제공하기 위해 동적입니다. 그것은 드문 일이 아니며 모듈 식 시스템을 원할 경우 실제로 권장됩니다. –

    1

    EventInspector는 (WorkItem에 저장되어있는) EventTopics를 사용하여 모든 과중한 작업을 수행합니다.

    <?xml version="1.0" encoding="utf-8" ?> 
    <configuration> 
        <system.diagnostics> 
         <switches> 
          <add name="Microsoft.Practices.CompositeUI.EventBroker.EventTopic" value="All" /> 
         </switches> 
        </system.diagnostics> 
    </configuration> 
    

    이 많음을 확인해야합니다 : 각 EventTopic 객체는 TraceSource에 대한 접근은 어떤이처럼 app.config 파일에 사용할 수 있습니다

    Microsoft.Practices.CompositeUI.EventBroker.EventTopic

    라고있다 유용한 메시지가 Visual Studio의 디버그 창으로 라우팅됩니다. VS 디버그 창을 벗어나고 싶다면 많은 옵션이 있습니다. 나는 다음과 같은 기사를 체크 아웃 권하고 싶습니다 : 그런데

    Code Instrumentation with TraceSource My Persoanl Vade Mecum

    관련 문제