2009-10-16 3 views
1

:<param, param2> 액션을 이벤트의 대리자 유형과 호환되게 만드는 방법은 무엇입니까? 아래의 코드 감안

void LookupBox_Load(object sender, EventArgs e) 
{ 
    Action d = delegate 
     { 
      if (!_p.AutoClose) 
       CloseLookupBox(); 
     }; 

    if (this.ParentForm.MdiParent != null) 
     this.ParentForm.MdiParent.Deactivate += delegate { d(); }; 
    else 
     this.ParentForm.Deactivate += delegate { d(); }; 
} 

)는 (대리인 {D를 생략하는 방법이이고; }?

void LookupBox_Load(object sender, EventArgs e) 
{ 
    Action<object,EventArgs> d = delegate 
     { 
      if (!_p.AutoClose) 
       CloseLookupBox(); 
     }; 

    if (this.ParentForm.MdiParent != null) 
     this.ParentForm.MdiParent.Deactivate += d; 
    else 
     this.ParentForm.Deactivate += d; 
} 

참고 :이 인라인

답변

4

절대적으로 - 유형을 변경하십시오하지만 나중에 참조 할 수 있도록

EventHandler d = delegate 
    { 
     if (!_p.AutoClose) 
      CloseLookupBox(); 
    }; 
익명 방법 그냥 Func을하고 액션 작동하지 않습니다

...

, 당신은 A를 기존 기반으로 새 대리자를 만들 수 있습니다 : (210)로 시작하는 호환 서명 :

Action<object, EventArgs> d = ...; 
EventHandler handler = new EventHandler(d); 

그러나이 여분의 간접는 또한 t을 할 수

이 경우 :)의 무의미 ,

Form form = ParentForm.MdiParent ?? ParentForm; 
form.Deactivate += delegate 
{ 
    if (!_p.AutoClose) 
     CloseLookupBox(); 
}; 
+0

으악 :에 모든 방법을 전환,

Form form = ParentForm.MdiParent ?? ParentForm; form.Deactivate += d; 

당신이 다음 한 번만 d를 사용하는 것처럼, 당신이 그것을 인라인 수 : 그는 약간 너무 널 병합 연산자를 사용하여 간단하게 그것을 호출하는 코드 네가 옳아; 그는 바닐라 EventHandler를 사용하고 있으므로 제네릭이 필요하지 않습니다. 제네릭을 사용하면 성과 측면에서 어떤 페널티가 발생합니까? – gn22

+0

글쎄, 당신은 올바른 유형을 구독해야합니다. 따라서 어쨌든 비 전형적인 인스턴스를 만들어야 할 것입니다 ... –

+0

null 통합 연산자 제안. 당신의 마음은 모든 프로그램의 의도를 실제로 고를 수 있습니다. – Hao

2

아니 훨씬 더하고 싶어하지만, 당신이 사용하는 경우 당신이 할 수있는 C# 3.0 :

if (this.ParentForm.MdiParent != null) 
    this.ParentForm.MdiParent.Deactivate += (x,y) => d(); 
else 
    this.ParentForm.Deactivate += (x,y) => d(); 
0

당신은 사람들을 대신 정의 EventHandler<MyEventArgs>를 사용한다 액션 대표단

EventHandler<EventArgs> d = delegate   
     {    
      if (!_p.AutoClose)     
       CloseLookupBox();   
     };