2012-07-12 2 views
2

위임자에게 함수 호출을 추가하고 싶지만 각 함수 호출에는 고유 한 매개 변수가 있습니다. 내가 너희들 :위임 할 매개 변수 전달 C#

아래 일부 의사에 의존하고, 그래서 나는 생각한다

(그러니까 기본적으로, 나는 대리자 및 이벤트와 AddToDelegate 기능을 만드는 오전 .. 다른 곳에서 해결책을 알아낼 또는 찾을 수 없습니다 문제가 행과 AddToDelegate 기능으로 제공 a += new A(SomeFunc)(i.ToString()); 정말 만 += new A(SomeFunc);)

해야한다 - 함수 (고유 값) 이벤트에 호출을 추가하려면 다음 GetData의 기능을 하나의 문자열에서 모든 응답을 반환

대리인에게이 작업을 수행 할 수있는 방법이 있습니까? 아니면 잘못된 트리를 짖고 있습니까?

public delegate string A(string s); 
public event A a; 

public void AddToDelegate() 
{ 
    for (int i = 0; i < DelegateList.Length; i++) 
    { 
     a += new A(SomeFunc)(i.ToString()); 
    } 
} 

public string GetData() 
{ 
    StringBuilder _sb = new StringBuilder(); 
    if (a != null) 
    { 
     Delegate[] DelegateList = a.GetInvocationList(); 
     for (int i = 0; i < DelegateList.Length; i++) 
     { 
      _sb.Append(((A)DelegateList[i])); 
     } 
    } 
    return _sb.ToString(); 
} 
+3

무엇을하려고합니까? –

+0

위의 의사는 모든 고유 값을 자세히 설명하는 문자열을 생성합니다. – T1gg3rB0unC3

+0

위 질문은 위의 의사 코드가 달성하지 못한 것이 아니라 성취하려는 것을 묻습니다. 당신은 틀린 나무를 짖고 있을지도 모르지만, 당신이 할 수없는 * 방법보다는 당신이하고 싶은 것을 * 말하지 않는 한 우리는 그것을 알 수 없습니다. 귀하의 의견은 무엇이며 예상되는 결과는 무엇입니까? 구현 예제가 아닌 사용 예제를 제공하십시오. –

답변

1

확실하지 당신이 정말로 원하는,하지만 당신은 그 범위 내에서이 여분의 변수를 개최한다 익명 함수 사용할 수있는 :

a += new A(s => { 
    string extra_value = i.ToString(); 
    return SomeFunc(s, extra_value); 
    }); 

이로 단순화 할 수있다 :

a += s => SomeFunc(s, i.ToString()); 
0

labda expressionsclosures을 통해이 작업을 수행 할 수 있습니다.

아래 예제에서는 루프 할 때 SomeFunc에 i 값을 추가하는 대리자를 만듭니다. 올바른 값이 캡처되도록하려면 capture 변수가 필요합니다. How to tell a lambda function to capture a copy instead of a reference in C#?

public event Action<string> a; 

public void AddToDelegate() 
{ 
    for (int i = 0; i < DelegateList.Length; i++) 
    { 
     int capture = i; 
     a +=() => SomeFunc(capture.ToString()); 
    } 
} 

public string GetData() 
{ 
    StringBuilder _sb = new StringBuilder(); 
    if (a != null) 
    { 
     Delegate[] DelegateList = a.GetInvocationList(); 
     for (int i = 0; i < DelegateList.Length; i++) 
     { 
      _sb.Append((Action<string>)DelegateList[i]()); 
     } 
    } 
    return _sb.ToString(); 
} 
+0

여전히 sb.Append()에 난잡한 문제를 해결해야합니다. –

+0

@HenkHolterman - 고지에 대한 고마움 – shf301

+0

'()'은 여전히 ​​작동하지 않습니다 (A는 문자열 매개 변수를가집니다). –