2010-07-06 3 views
3

콜백 처리기를 추가 한 상당히 일반적인 클래스 (레코드)가 있으므로 다음과 같은 작업을 수행 할 수 있습니다.C# : 콜백에 매개 변수 전달

record.Save(AfterSaveMethod); 

생성 된 레코드의 ID 번호도 반환합니다. 내가 지금 가지고있는 문제는 루프 안에이 중첩 된 저장 루틴이 있고, i 변수를 사용/전달해야한다는 것입니다.

for (int i; i < count ;i++) 
{ 
    record.Save(AfterSaveMethod2) //but I need to pass i through as well 
} 

여기서 어떻게해야합니까?

\는, 저장 방법을 다시 작성하고 그것을 포함이 클래스에서 (수다),

B의 \가 매개 변수로 오브젝트를 옵션 저장 과부하, 그래서 나는 내 기록 클래스에 통과 할 수 ID 번호와 병합하십시오. ID 번호와 전달 된 객체에 포함 된 여분의 항목을 모두 반환합니다. (음, 다소 지저분한 것 같습니다)

C \는 더 섹시한 옵션입니까? 익명 메소드 또는 람다 표현식 :

이 (가정 C# 3) 시도 정말 편리한 곳에

답변

7

입니다 : 여기 람다 표현식 index하지 i을 캡처하는 것을

for (int i = 0; i < count; i++) 
{ 
    int index = i; 
    record.Save(id => AfterSaveMethod2(id, index)); 
} 

주 - 그건 closing over the loop variable의 고유 한 문제점을 피하십시오.

+0

매우 우아한 해결책에 영향을 미치지 않습니다 동시에 여러 통화를 수 미스터 스켓! – decyclone

+0

ok, 의미가 있습니다, 그냥 foo를 정렬해야합니다.) 액션 은 내 대리자 유형입니다. –

+0

@ Grayson : 전달 된 정수는 무엇입니까? –

0
class SexierSaveMethod 
    { 
     public Int32 Index { get; set; } 

     public SexierSaveMethod(Int32 i) 
     { 
      Index = i; 
     } 

     public void AfterSaveMethod() 
     { 
      // Use i here 
     } 
    } 

    record.Save(new SexierSaveMethod(i).AfterSaveMethod); 
2

당신은 또한 당신이 정적 속성 (예를 들어이 MyContext.Current)를 사용하여 액세스 할 수 있습니다 "상태"(이 경우, 인덱스 변수 값)를 저장하는 (스레드 정적) 컨텍스트 개체를 만들 수 있습니다. 컨텍스트의 복잡성에 따라 달라집니다.

WCF는 OperationContext.Current, ASP.NET, TransactionScope 외에도 다음과 같은 것을 사용합니다.

컨텍스트가 너의 것보다 약간 복잡하고 여러 메서드의 시그니처를 오염시키지 않으려면이 모델이 매우 깔끔하다고 생각합니다.

사용 :

// init context 
MyContext.Current = new MyContext(); 
for (var idx = 0; idx < 99; idx++) { 
    MyContext.Current.Idx = idx; 
    record.Save(AfterSaveMethod);   

} 
// uninitialize context 
MyContext.Current = null; 

(매우 단순한 샘플)

상황 인 경우 [ThreadStatic] 당신이 서로

+0

펑키, 멋지게 보입니다. –