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);
그런데 이를 Getter만 호출하여 ReadOnly로만 사용할 경우는 상관없는데,
Setter를 호출하려 한다면 이 방법은 권장하지 않습니다.
이때 가장 큰 문제점이 Setter를 호출해 데이터를 업데이트하였지만 코드 상에서 추적이 불가능하기 때문에 나중에 번거로운 일이 분명 생길거에요…
따라서, 단순히 같은 데이터 타입의 프로퍼티가 많다면 그냥 엔티티 클래스 내부에서 List<string>과 같은 컬렉션 타입을 사용해보세요.
타입 고정적인 언어에서는 이렇게 순회하는 것이 적절하지 않을 수 있어요.
당장 @level120 님이 말씀하신 것도 문제가 되구요
get 에서도 문제가 있습니다.
dynamic 언어들은 읽기 변수를 아무거나 막 받고 막 집어 넣어도 문제없지만
C# 같이 타입 고정적인 언어에서는
foreach 를 통해 순회한다고 해도 각 property 들의 타입이 다르다면
매 순회마다 대상 읽기 변수의 타입을 지정하기 어려워 집니다.
foreach(var property in GetProperties())
{
// int, string, Stream 등등 property 들의 타입이 모두 다르다면
// 위 property 변수에 어떤 타입이 와야 하나요?
// var 에 의존적인 코딩이 불가능합니다. var 는 dynamic 이 아니니까요.
}
그렇다고 전부 object 로 받을 수도 없으니까요.
(뭐 억지로 object 로 받았다가 필요한 위치에서 원하는 타입으로 형변환하는 정도는 가능하겠지만…)
타입 고정정인 언어에서는
이름과 타입을 주고 특정 property 를 찾아오는 건 괜찮아 보이는데 전체 property 순회는
어려운 게 사실이죠.