2010-01-06 6 views
4

클래스 'KeyEvent'가 있습니다. 어떤의 구성원 중 하나는 다음인수가있는 델리게이트 사용

private eventmethod em; 

생성자 :

public KeyEvent(eventmethod D) { 
    em = D; 
    } 
    public KeyEvent(eventmethod D, object[] args) : this(D) { 
    this.args = args; 
    } 
    public KeyEvent(Keys[] keys, eventmethod D, object[] args) : this(keys, D) { 
    this.args = args; 
    } 

'eventmethod'방법

public delegate void eventmethod(object[] args); 

생성자에서 객체 전달 방법

이 부재에 저장된 공개 메서드 "ThrowEvent"를 사용하여 호출됩니다.

public void ThrowEvent() { 
    if (!repeat && thrown) return; 
    em.DynamicInvoke(args); 
    this.thrown = true; 
    } 

내가 볼 수있는 한, 이것은 잘 컴파일됩니다. 하지만이 클래스 (KeyEvent)의 인스턴스를 만들려고 할 때 나는 잘못된 것을하고있다.

static public void ChangeSquareSpeed(Vector2 squarespeed) { 

    } 

어쨌든, 잘못된 라인이 하나입니다 : 이것은 내가 지금까지 무엇을 가지고 :

object[] args = {new Vector2(0.0f, -200.0f)}; 
    Keys[] keys = { Keys.W }; 
    KeyEvent KeyEvent_W = new KeyEvent(keys, new KeyEvent.eventmethod(GameBase.ChangeSquareSpeed), args); 

GameBase.ChangeSquareSpeed ​​순간에 아무것도하지 않지만, 다음과 같습니다

KeyEvent KeyEvent_W = new KeyEvent(keys, new KeyEvent.eventmethod(GameBase.ChangeSquareSpeed), args); 

컴파일러 나에게 주시는 오류 :

오류 CS: 'ChangeSquareSpeed'경기 대리인 없음 과부하 'BLBGameBase.KeyEvent.eventmethod'

내 질문은 : 내가 가지고있는이 평균이 경우, 더 나은 것입니다 (매개 변수를 취하지하는 ChangeSquareSpeed을 변경합니까 이 일을하는 방법?), 또는 내가 문법적으로 잘못된 것을하고 있습니까?

미리 감사드립니다.

답변

4

나는이 오류가 매우 명백하다고 생각한다. ChangeSquareSpeed 메서드가 대리자와 일치하지 않습니다. 대리자는 하나의 매개 변수로 object[]이있는 메서드를 기대하지만 Vector2 메서드를 매개 변수로 전달하므로 오류가 발생합니다.

이 방법을 시도해보십시오

static public void ChangeSquareSpeed(object[] squarespeed) 
{} 

(갱신) 나는 특별히 라인, 코드에 약간의 혼동을 볼

: 난 정말 이해할 수없는

object[] args = {new Vector2(0.0f, -200.0f)}; 

Vector2 또는 Vector2의 객체 배열을 원한다면

당신은 내가이 합리적으로 보일 수 있습니다 생각 Vector2 년대의 배열이 척 경우

변경 대리자 :

public delegate void eventmethod(Vector2 args); 

다음

public void ThrowEvent() { 
    if (!repeat && thrown) return; 
    foreach(object obj : args) 
    { 
     em.DynamicInvoke((Vector2)obj); 
    } 
    this.thrown = true; 
} 

(업데이 트를 2)

그 경우 KeyEvent의 일반 버전을 만들어야한다고 생각합니다. 이 예제를 참조하고 거기에서 이동합니다

class KeyEvent<T> 
    { 
     public T Args { get; set; } 
     public Action<T> A { get; set; } 

     public KeyEvent() { } 

     public void ThrowEvent() 
     { 
      A.DynamicInvoke(Args); 
     } 
    } 

    // ... 

    static void M1(object[] o) 
    { 
     Console.WriteLine("M1 {0}", o); 
    } 

    static void M2(Vector2 v) 
    { 
     Console.WriteLine("M2 {0}", v); 
    } 

    static void Main(string[] args) 
    { 
     KeyEvent<object[]> e1 = new KeyEvent<object[]> 
     { 
      A = new Action<object[]>(M1), 
      Args = new object[] {}; 
     }; 
     KeyEvent<Vector2> e2 = new KeyEvent<Vector2> 
     { 
      A = new Action<Vector2>(M2), 
      Args = new Vector2(); 
     }; 
    } 
+0

그러나이 경우 squarespeed에 전달 된 객체를 벡터로 어떻게 사용합니까? ChangeSquareSpeed에서 Vector2 만 사용하고 싶습니다. 더 좋은 방법은 없을까요? – Xenoprimate

+0

@ 모티크, 내 업데이트 참조. 당신이 Vector2의 배열이나 Vector2의 객체를 KeyEvent의 인수로 사용하기를 원한다면 정말로 말할 수 없습니다. –

+0

음,이 방법이 적합 할 수 있습니다.하지만 대리자 eventmethod가 유연해야합니다. 이 예에서는 Vector2를 전달하는 데이 메서드를 사용하지만 호출 할 '이벤트'가 무엇인지에 따라 다른 것으로 전달할 수도 있습니다. – Xenoprimate

2

대리인 eventmethod 상태를 사용하여 모든 이벤트가 유일한 매개 변수로 object[] (인수를)해야한다는. 당신이이 코드를 사용하는지에 따라, 당신도 할 :

  • 변경 ChangeSquareSpeed(object[] squarespeed)
  • ChangeSquareSpeed의 서명이 서명 void neweventmethod(Vector2 args);와 함께, 새로운 대리자를 만들고 사용하는
  • 변경 서명 eventmethod ~ 위의
0

C# 3 인 경우 대표자를 Action<object[]>으로 변경하십시오. 그것은 당신의 삶을 훨씬 더 단순하게 만들 것입니다.

this.em(args); 

을 당신이 대신 확인 컴파일 시간을 가질 것입니다 : 당신은 단순히 이런 식으로 호출 할 수 있도록 할

.

+1

Func 대신 대리자 동작 으로 이동하십시오. Func은 첫 번째 제네릭을 반환 형식으로 사용합니다. 이것은 매개 변수 유형이 아닙니다. 액션은 void를 반환하므로 나열된 모든 제네릭 유형은 인수 유형입니다. –

+0

그건 맞습니다 - 지적 해 주셔서 감사합니다. 답변을 업데이트했습니다. –

관련 문제