인수로 익명 형식의 매개변수 전달하면 받는 메서드 에서는 어떻게 받을 수 있을까요?

선배님들 안녕하세요
찾아봐도 같은 메서드 내에서는 접근이 가능한데 매개변수로 넘기면
받는것 까지만 되고 접근할 방법을 못 찾아서요.

제가 작성중인 코드의 일부분입니다.
익명 형식을 만들어 다른 메서드에 파라미터로 넘기는 경우
호출되는 메서드 에서는 어떤 형식으로 선언해서 받아야 할까요?

파라미터로 전달 받는 메서드 측에서 어떤 형식으로 선언을 해줘야
리스트 요소 및 속성에 접근이 가능할까요?

캐스팅 또는 특정 형식으로 받아야 하는지 가르침을 주십시요^^

아래는 예시 코드 입니다.
현재 받는 메서드에서 List형식으로 받고자 했지만
리스트 요소는 물런 속성에 접근이 안되네요.

private void AAA()
{
var save_ManualData = new List();

//루프를 돌면서 리스트에 익명형식으로 추가합니다.
foreach( ~~~~~~~)
{

    save_ManualData.Add(
             new
             {
                  SiteCode = "N001",
                  NetCode = selectedData.NetCode,
                  StationCode = selectedData.StationCode,
                  RecorderCode = selectedData.RecorderCode,
                  SensorCode = selectedData.SensorCode,
                  Channel = channel_ImagesObject[0].ChannelName,
                  Output_AnaDate = currentDate,
                  PSD_ImgPath = psdPath,
                  Spectrogram_ImgPath = sptPath,
                  Spectrum_ImgPath = specPath,
                  Start_AnaDate = selectedData.SDate,
                  End_AnaDate = selectedData.EDate
              }); 
}     
  //BBB 메서드에 익형형식을 인수로 전달
 BBB(save_ManualData);

}

//호출 메서드
private void BBB( List < object > data )
{
//data의 요소는 물런 속성에도 접근할수 없습니다.
}

3 Likes

익명 형식으로 메서드에 매개변수를 object로 전달하면 메서드에서 속성 접근이 안됩니다.

익명 형식은 말 그대로 익명이므로 그 형식을 다른 클래스 속성이나 메서드 인자에 사용할 수 없습니다. 익명 형식을 사용하지 않고 클래스 등으로 형식을 만든 다음 사용하거나 dynamic형식을 이용할 수 있습니다.

예)

var a = new { A = 1, B = 2, C = 3 };

var list = new List<dynamic>();
list.Add(a);
Console.WriteLine(list[0].A);
5 Likes

감사합니다. 선배님…
역쉬 안되는 군요…

전에 dynamic도 쓰는게 번거롭다(?) 생각되서 방법을 찾고자 했는데…ㅎ

제가 방법을 못 찾은게 아니고 안되는 거였군요 ^^;;
감사합니다.

2 Likes

네… 그런데 익명으로 사용하고자 하는 이유가 있을까요?

2 Likes

@dimohy 님이 잘 설명해주셨네요

저렇게 동작하면 가끔 참 편할 것 같기도 한데 말이죠 ㅎㅎ

추가 답변을 드릴 수 있을지도 모르겠어서 저도 @dimohy 과 같은 질문 드려봅니다!

익명으로 Add() 하신 이유를 여쭤봐도 될까요?

3 Likes

부끄럽지만 Model로 쓸 class가 많다보니
일일이 선언 안하고 사용했었습니다.
무한 반복이 많다 보니 귀찮음이… ^^;;;;;;

보통은
ASP Core MVC Controller에서

object 배열에 익명 클래스를 넣어서
반환해보니 편하더군요 ㅎㅎ;
AJAX에서는 바로 접근이 가능했어서 좋았습니다.

이 외에도 일정 데이터를 취합해서 전달만 하는 코드에서 사용했었습니다.
게으름이 들킨것 같아 창피하네요;;;;
ex)
return Json( new object { 익명형식, 익명형식 });

이런 식으로 했었습니다.

2 Likes

선배님 말하기 창피한데…
많은 Model을 만들다 보니 귀찮니… 죄송합니다. ㅎㅎㅎ;;;

3 Likes

그러시군요…

C#은 정적 언어라 속성에 접근하려면 정확한 형식을 알고 있어야 합니다.
익명 형식의 경우 형식이 은닉 되므로 사용할 수가 없습니다.

object로 업케스팅 하게 되면 다운케스팅 하여 접근할 수는 있는데 이것 역시 형식을 알아야 다운케스팅이 가능합니다.

dynamic 형식의 경우 컴파일 타임이 아닌 런타임 때 속성 유무를 확인하고 접근하기 때문에 동작 속도에서 조금 손해를 보게 되고 인텔리센스를 이용할 수 없어서 번거로움이 있습니다. (아마 그 이유가 dynamic의 불편함이셨던것 같아요)

결론은… 정적 언어의 특징에 맞게 모델을 하나하나 생성하는 것일텐데… ^^; 만들고 나면 번거로움이 줄어드니… 그렇게 하시죠 ^^;

참고로 익명 형식은 Visual Studio의 리팩토링을 이용해서 빠르게 튜플, 레코드 또는 클래스로 변환할 수 있습니다.

image

4 Likes

리펙토링이라 하심은
자동으로 코드를 치환해준다는 건가요?

사용해 본적은 없어서요.^^;;

만약 자동 치환으로 가독성을 높이는 거면
좋겠습니다.
아닌가? 가독성 보다는 편리함이 클수도 있겠네요 ㅎ

튜플도 자주 쓰는편인데
좋은 정보 주셔서 감사합니다.

또 말씀하신 dynamic도 설명 하신대로 입니다.
그냥 익명형식 쓰는게 더 편하고 작성도 덜 번거럽다(?) 느겼습니다.

자바스크립트를 처음 만질 때는 정말 적응 안되고 싫었는데
의외로 동적 언어도 나름 장점이 있다고 생각 들었습니다.

그래도 자바스크립트 보다는 c#이 더 좋아요 ㅎㅎ

2 Likes

이 마음은 딱 Javascript 유저의 마음이 아닐까싶네요. 만들어야 하는 Model이 많다면 Automapper를 사용하는걸 검토해 보세요. https://dotnettutorials.net/course/csharp-dot-net-tutorials/

3 Likes

답변 감사합니다. 선배님

원래 저는 WPF를 좋아하는데…
회사에 와서 ASP Core MVC를 더 많이 하네요 ㅎㅎㅎ;;

말씀해주신 내용은 찾아서 살펴보겠습니다.
감사합니다.^^

2 Likes