0

간편한 읽기 코딩을 위해 대리인 생성을 단순화 할 수있는 방법이 있습니까? 여기에 내가 할 수 있도록하고 싶습니다 무엇의 예와 그것을 할 수있는 방법이 있는지 궁금 해서요 :메서드를 전달하여 대리자를 간단하게 만들 수 있습니까?

public delegate void MyDelegate(Object sender, EventArgs e); 

public class ClassWithEvent 
{ 
    public event MyDelegate MyEvent; 

    public ClassWithEvent() { } 

    public void RegisterForEvent(Method) 
    { 
     MyEvent += new MyDelegate(Method); 
    } 

    public void Trigger() 
    { 
     if(MyEvent != null) 
     { 
      MyEvent(this, null); 
     } 
    } 

} 

public class ClassToRegister 
{ 
    public ClassWithEvent MyEventClass = new ClassWithEvent(); 

    public ClassToRegister() { } 

    public void RegisterMe() 
    { 
     MyEventClass.RegisterForEvent(MyEventMethod); 

     MyEventClass.Trigger(); 
    } 

    public void MyEventMethod(Object sender, EventArgs e) 
    { 
     Console.Writeline("Hello there!"); 
    } 
} 

이 캡슐의 이익에 부합하려고 노력 뒤에 점을. 이벤트를 발생시키는 클래스는 클래스에 액세스하는 본질적으로 블랙 박스라고 가정합니다. 이것이 내가 볼 수있는 가장 바람직한 객체 지향 흐름이 될 것이므로, 이것을 수행하는 방법이 있는지 또는 등록 클래스가 작성해야하는 위임자에 대한 지식이 없으면이를 수행 할 수있는 방법이 없는지 궁금합니다.

+0

이 작업을 수행이 당신이 * * 일을하고 싶은 코드, 코드이며 CHAGE 싶어? 후자의 경우 *해야한다고 생각하는 것을 제공 할 수 있습니까? – BradleyDotNET

+0

이것은 가상의 코드입니다. 나는 이벤트와 대표자들에게 아직 익숙하지 않아서 내 질문에 아무런 관련이없는 어딘가에서 실수를했을지도 모른다. 한 클래스가 해당 메서드에 대한 대리자를 자체 코드로 선언하지 않고 해당 메서드를 단순히 전달하는 방법이 있는지 궁금합니다. I.E. - "MyDelegate"의 이름에 대한 지식없이 "ClassToRegister"가 "MyEvent"에 가입 할 수 있습니까? – ThisHandleNotInUse

+0

일반 작업 대리자를 사용할 수 있습니까? – BradleyDotNET

답변

1

예,이 기능을 사용하려면 네임드 대리자가 필요하지 않습니다. 대신 일반 대표 Action (Action<object, EventArgs>)을 사용할 수 있습니다. 액션 대리자는 void를 반환하고 제네릭 형식 인수와 일치하는 매개 변수를 갖습니다.

일반적으로 이벤트를 직접 노출하기 만하면 ("등록"기능 제외) 어쨌든 그 부분에 대해 걱정할 필요가 없습니다.

당신이 그것을 사용하는 경우, 코드의 모습 :

public class ClassWithEvent 
{ 
    public event Action<object, EventArgs> MyEvent; 

    public ClassWithEvent() { } 

    public void RegisterForEvent(Action<object, EventArgs> Method) 
    { 
     MyEvent += Method; 
    } 

    public void Trigger() 
    { 
     if(MyEvent != null) 
     { 
      MyEvent(this, null); 
     } 
    } 

} 

public class ClassToRegister 
{ 
    public ClassWithEvent MyEventClass = new ClassWithEvent(); 

    public ClassToRegister() { } 

    public void RegisterMe() 
    { 
     MyEventClass.RegisterForEvent(MyEventMethod); 

     MyEventClass.Trigger(); 
    } 

    public void MyEventMethod(Object sender, EventArgs e) 
    { 
     Console.Writeline("Hello there!"); 
    } 
} 
+0

대단히 고마워요. 제가 정확히 무엇을 찾고 있는지 확신 할 수 없었기 때문에 실제로 이것을 찾는 방법을 찾지 못했습니다. http://msdn.microsoft.com/en-us/library/system.action% 28v = vs.110 % 29.aspx 매우 감사드립니다. – ThisHandleNotInUse

+0

"이벤트 직접 노출"이 객체 지향 구조의 감각을 위반하는 것으로 보이는 C#의 한 가지입니다. 나는 아직도 "ClassToRegister"클래스에서 그것을 선언해야한다고 생각하기 때문에 나는 일반 위임자와 함께 행복하지 않다. 그러나 나는 포인터를 만들지 않고 메소드를 전달할 방법이 없다고 생각하고 있었다. 어쨌든 "그것을 안으로"저장하십시오. 구독자 매개 변수를 기반으로 구독자에게 알리는 내부 클래스를 사용하여 "이벤트 배열"을 만들고 있으므로 구독 클래스에서 배열 자체를 관리 할 수 ​​없습니다. – ThisHandleNotInUse

+0

예, 어딘가에 유형을 선언해야합니다! 나는 OOP를 깨는 사건에 대해 동의하지 않으면 안된다. 호출 할 함수 포인터의 자동 목록을 얻는 것이다. + = 기본적으로 "등록"기능입니다. 그래도 내 의견. 도움이 될 수있어서 다행입니다! – BradleyDotNET

관련 문제