엔티티(VO) 클래스와 연관된 질문 드립니다.

Entity 클래스에 Set을 통한 데이터가 등록되었고
객체를 생성하여 Get을 하여 데이터를 출력하려고 합니다.

ex)

class Entity 
{
    string data_1 { get; set }
    string data_2 { get; set; }
    ....
    string data_N { get; set; }
}

Entity obj = new Entity();
string data_1 = obj.data_1;

이런 식으로 말입니다.

문제는 해당 필드가 생각보다 많을 경우가 문제가 돌 듯 합니다.
혹시 이 엔터티클래스를 배열 혹은 순환할 수 있는 방법이 없을 까요?

foreach(var field as obj) // 이렇게 말입니다.

2개의 좋아요

저도 질문을 보고 궁금해 져서 찾아 보았는데

foreach와의 규격을 맞춰서 인터페이스를 구현한다면 그렇게 사용 가능 한 것 같았습니다.

Offensive Security Research Lab. :: 11. 순회가 가능한 객체 만들기 (tistory.com)
위에 있는 블로그 글 보고 참고하시면 될 것 같습니다.
한 가지 드는 생각은 엔티티 클래스에서의 사용에 문제가 없을지는 모르겠네요

4개의 좋아요
public class User{
    public int id {get;set;} = 1234;
    public string name {get;set;} = "홍길동";
}

public void GetProperties<T>(T obj){
    
    System.Reflection.PropertyInfo[] props = typeof(T).GetProperties();

    foreach(var prop in props){
        Console.WriteLine(string.Format("{0}.{1} = {2}",
                                typeof(T).Name, prop.Name, prop.GetValue(obj, null)));
    }
}

User _user = new User();

GetProperties<User>(_user);

이런걸 말씀하시나요?

6개의 좋아요

@_jeonghwan 님께서 언급하신 방법으로 해결이 가능합니다.

그런데 이를 Getter만 호출하여 ReadOnly로만 사용할 경우는 상관없는데,
Setter를 호출하려 한다면 이 방법은 권장하지 않습니다.
이때 가장 큰 문제점이 Setter를 호출해 데이터를 업데이트하였지만 코드 상에서 추적이 불가능하기 때문에 나중에 번거로운 일이 분명 생길거에요…

따라서, 단순히 같은 데이터 타입의 프로퍼티가 많다면 그냥 엔티티 클래스 내부에서 List<string>과 같은 컬렉션 타입을 사용해보세요.

5개의 좋아요

이게 javascript 같은 언어에 비해 참 아쉬운 부분이긴 한데요.

타입 고정적인 언어에서는 이렇게 순회하는 것이 적절하지 않을 수 있어요.
당장 @level120 님이 말씀하신 것도 문제가 되구요

get 에서도 문제가 있습니다.
dynamic 언어들은 읽기 변수를 아무거나 막 받고 막 집어 넣어도 문제없지만

C# 같이 타입 고정적인 언어에서는
foreach 를 통해 순회한다고 해도 각 property 들의 타입이 다르다면
매 순회마다 대상 읽기 변수의 타입을 지정하기 어려워 집니다.

foreach(var property in GetProperties())
{
   // int, string, Stream 등등 property 들의 타입이 모두 다르다면
   // 위 property 변수에 어떤 타입이 와야 하나요?
   // var 에 의존적인 코딩이 불가능합니다. var 는 dynamic 이 아니니까요.
}

그렇다고 전부 object 로 받을 수도 없으니까요.
(뭐 억지로 object 로 받았다가 필요한 위치에서 원하는 타입으로 형변환하는 정도는 가능하겠지만…)

타입 고정정인 언어에서는
이름과 타입을 주고 특정 property 를 찾아오는 건 괜찮아 보이는데 전체 property 순회는
어려운 게 사실이죠.

3개의 좋아요