2017-11-01 1 views
0

런타임에 정의한 대리자가 있습니다. 사전에 특정 키가 포함되어 있는지 확인하고 싶습니다. 대리자 매개 변수 중 하나는 사전에 대한 ref이므로 사전은 항상 최신 버전 (고정 된 복사본이 아님)입니다.C# 대리자 참조없이 개체 필드 값 사용

그러나 조회 할 키는 object 필드이지만 그 개체에 ref을 전달하고 싶지 않습니다. 필드 값을 잡고 상수 (고정 된 사본) 인 것처럼 사용하고 싶습니다.

정확한 코드 발췌 문장입니다. netController에 ref를 전달하면 어떤 것이 있는지 확인하는 데 ContainsID()을 사용할 수 있습니다. ID 매개 변수는 msg 개체에서 가져 오지만 컨테이너 개체에 대한 참조없이 값을 사용하고 싶습니다.

nc이 대리인의 범위에 있지만 msg 아니다. 이것이 가능합니까 아니면 매개 변수로 모든 것을 전달해야합니까?

참고 : 사전을 말하지만 실제로는 사전과 같은 개체입니다. ContainsID()ContainsKey()의 래퍼입니다. 이 부분에 대해 걱정하지 마십시오.

답변

1

위임자가 변수를 암시 적으로 캡처하는 것으로 불리는 것이 가능합니다.

는만큼 msg 당신의 대리자를 만들어 줄 외부의 범위에서와 같이, C#을을 캡처하고 당신이 당신의 코드 내에서 사용 할 것이다 : 방법 위

Func<Controller,bool> MakeChecker(Message msg) { 
    return nc => nc.ObjectRegister.ContainsID(msg.parentObjectID); 
} 

가 작성하는 문맥에서 암시 적으로 msg을 캡처 대리자 매개 변수로 전달하는 대신 대리자를 전달합니다.

Func<Controller,bool> MakeChecker(Message msg) { 
    return delegate (netController nc) { 
     return nc.ObjectRegister.ContainsID(msg.parentObjectID); 
    } 
} 

가 어떻게 대리자로이 저장합니까 : 나는 익명의 대리인이 구문 대신 람다 구문을 사용? 이처럼

: 그 구문에 의해 혼란 조금, 어딘가에 할당 안 해요

Message msg = ... 
Func<Controller,bool> myChecker = MakeChecker(msg); 
+0

? 대리인에 이것을 어떻게 저장합니까? – Oliver

+0

@Oliver 편집을 참조하십시오. – dasblinkenlight

+0

나는 두껍습니까? 아니면 여전히 뭔가를 놓치고 있습니까? '''Func <컨트롤러, bool> MakeChecker (메시지 msg) { return nc => nc.ObjectRegister.ContainsID (msg.parentObjectID); }'''는 나를 위해 맞지 않습니다. .net 2.5를 사용하고 있습니다. 죄송 합니다만 언급하는 것을 잊어 버렸습니다. 메시지가 문맥에서 유효하지 않은 유형입니다. 예상. 또는 = return 문이 포함 된 주 기능에서 반환하려고 시도하고 있습니다 (문제가 발생 함). – Oliver