퇴근5분전

 공통 UI쪽 관련해서 조금 만지는 부분이 있는데... 

코드를 아래와 같이 쓸수 있으면 어떨까? 라는 생각을 해봤다. 

  Call()( msg => msg( "x" ) );

 

Call() 호출하고 이어서 대리자로 연결된 메서드에 파라미터를 받아서 전달!!

 

UI를 다루면서 두가지 처리를 연속적으로 하게 되는 거였다. 

UseFlowBodyPanel();

foreach( var data in ListDatas ) {

     AddFlowBodyItem( data );

}

이런 식으로 처리하는 걸... 줄여서 

UseFlowBodyPanel()( AddFlowBodyItem => foreach( var data in ListDatas ) AddFlowBodyItem( data ) );

 

실제 코드는 여러가지 조건들을 고려해서 조금 바뀌지만...위 처럼 갈 것이다. 

 

다만 Call()은 테스트 코드로 작성했던것이기에... 기록으로 남겨두려 한다. 

 private Action<Action<Action<string>>> Call()

        {

            System.Diagnostics.Debug.WriteLine("Call!");

            Action<Action<Action<string>>> returnMethodCall

              = new Action<Action<Action<string>>>((msg)=> msg( Call_After ));            

            return returnMethodCall;

        }

 

        private void Call_After(string msg)

        {

            System.Diagnostics.Debug.WriteLine("Call_After!" + msg);

        }

 

Action<string> 은 Call_After( string msg )와 연결되는 게 기본이니까 알겠는데... 

 

연결지으려면 왜 Action<Action<...>> 으로 두개가 필요한건지는 잘 모르겠네... 

 

찾는 방법은 Call() (  <-- 이렇게 코딩해놓고 vs에 표시되는 인자값이 Action<string> 인지 확인하였더니 

Action<Action<...>> 이었다. 

 

Action  mth = s => console.Write( s ); 이런 형태로 Action이 빠지니까.. 

Call() 에서 리턴받은 object가 Action< Action < Action<string> > >

인데... 

Action이 하나 빠지고 

msg => msg( "x" ) 

msg는 Action<string> 이니까... 

Action<Action<string>> 을 정의한거고... 

.... 뭐래는겨......... 모르겠다 ㅠㅠ. 

머리속에 맞춰지지 않는 퍼즐이 있는 것 같은 느낌... 아.. 싫어.. 

 

Action<Action<string>> mth1 = mthCall => mthCall("?");
mth1(Call_After);

---------------------------------------------------------------------------------

Action대신 Method로 바꿔 생각해보면... 

 

Action< Action< Action<string > > >
Mth0(   Mth1(    Mth( string ) ) )
Mth0(   Mth1(    MethodName    ) )

Call()(  MethodName => MethodName( prms ) );

Action<string>  
   mth( string => string )

Action< Action<string > >
   mth1(   MethodName => MethodName( str )  )

Action< Action< Action<string > > >
   mth0(   mm =>  mm( MethodName ) )

 

Action<Action<Action<string>>> returnMethodCall

              = new Action<Action<Action<string>>>((msg)=> msg( Call_After ));            

 ----->    (msg)=> msg( Call_After )

 

이거 때문에 잠도 못잤네. 

Call() (   여기에서 왜? mth0이 사라지고 mth1이 대입되는거지??? ) : 두개가 벗겨지네...

 

 

Action<Action<Action<string>>> returnMethodCall = Call();
returnMethodCall( msg => msg("???") );

음... 실제 리턴받은걸 실행해보면... 위처럼 되네...? 

어라... 뭐지? 

 

Action<Action<Action<string>>> returnMethodCall

              = new Action<Action<Action<string>>>((msg)=> msg( Call_After ));     

 

returnMethodCall(   이자리는  Action<Action<string>>  타입이 들어와야 하니.. m => m("?") ); 

아... 이랬던가? 

new로 대상을 지정하는 람다식과 대리자를 호출하는 부분에 차이때문에 내가 헷갈린건가... 

아무렇지도 않게 사용하던거에... 정신이 나가버릴것 같네... 이제 이해가 된다...