2011-08-23 2 views
1

C# 및 Postsharp를 사용한 이벤트 차단에 대한 질문이 있습니다.Postsharp 타사 구성 요소 이벤트 차단

PostSharp에서 BeforeDropDown, RowSelected MouseClick 및 EventInterceptionAspect와 같은 이벤트의 실행을 취소하고 싶습니다.

하지만 코드를 작성할 수있는 적절한 위치를 찾을 수 없습니다. 예 :

[Serializable] 
class EventInter : EventInterceptionAspect 
{ 
    public override bool CompileTimeValidate(System.Reflection.EventInfo targetEvent) 
    { 
     return "FormClosed".Equals(targetEvent.Name); 
    } 

    public override void OnInvokeHandler(EventInterceptionArgs args) 
    { 
     if condition executes method otherwise no 
    } 
} 

형태 :

내가 이런 걸 시도

[EventInter] 
public partial class Frm_RomperMesa : KryptonForm 

을하지만 일을 않았나. 그래서 내가 원하는 것을 성취 할 수 있는지 알고 싶습니다.

감사합니다. 나는 분명히 희망한다.

+0

어떤 종류의 컨트롤입니까? 텔리 크 컨트롤처럼? 왜 직접 이벤트를 처리하지 않습니까? –

답변

0

예, 가능합니다. 문제는 코드에서 수행 할 수없는 다른 어셈블리에 정의 된 이벤트에 이벤트 차단 측면을 적용하려고한다는 것입니다. 그것은 당신이 할 수있는 어셈블리를 수정해야합니다

this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing); 

뒤에 디자이너 코드의 기본 양식 유형을 사용하여 처리하도록 설정이기 때문에 당신은 이벤트를 무시할 수 없습니다. 수정하려면 다음과 같은 측면과의 링크를 사용하여

public class EventAspectProvider : TypeLevelAspect , IAspectProvider 
    { 
     public IEnumerable<AspectInstance> ProvideAspects(object targetElement) 
     { 
      Type t = (Type)targetElement; 

      EventInfo e = t.GetEvents().First(c => c.Name.Equals("FormClosing")); 

      return new List<AspectInstance>() { new AspectInstance(e, new EventInter()) }; 
     } 

    } 

    [Serializable] 
    public class EventInter : EventInterceptionAspect 
    { 

     public override void OnInvokeHandler(EventInterceptionArgs args) 
     { 
      int x = 0; 

      if (x > 0) //Do you logic here 
      { 
       args.ProceedInvokeHandler(); 
      } 
     } 
    } 

기본적으로 내가하지 않는 것이 좋습니다되는가 system.windows.forms.dll을 수정 아래로 비등 . 그러나 다른 타사 공급 업체 라이브러리 인 경우이를 수행하십시오.

+0

대단히 감사합니다. TypeLevelAspect에 대한 대안이 있습니까? comunity 라이센스가 있고 라이센스가없는 이벤트를 사용하고 있다는 오류가 있어서요. –

+0

typelevelaspect를 제거하고 IAspectProvider를 구현해보십시오. –

0

다른 방법으로 해결할 수 있습니다. 이벤트에 연결되는 메서드에 대한 aspect를 사용하고 조건이 충족 될 경우 메서드의 정상적인 실행을 취소합니다. 이것은 발생하는 이벤트 양식을 막지는 않지만 이벤트 처리 코드가 실행되는 것을 방지합니다.

[EventInter] 
private void someForm_FormClosed(object sender, EventArg arg) {} 

우리는이 접근 방식을 우리 프로젝트에서 많이 사용합니다. 이벤트 처리 메소드 (예외 처리, 커서 처리 등)에 적용되는 몇 가지 측면이 있습니다.

우리는 어셈블리 레벨에서 aspect를 적용하고 우리는 CompileTimeValide를 사용하여 이벤트 처리 메소드의 서명을 인식합니다. 이론적으로는 100 % 신뢰도가 아니지만 지금까지는이 접근법에 아무런 문제가 없습니다.