이름을 기준으로 속성 값을 얻는 방법


147

이름을 기준으로 객체의 속성 값을 얻는 방법이 있습니까?

예를 들어 내가 가지고 있다면 :

public class Car : Vehicle
{
   public string Make { get; set; }
}

var car = new Car { Make="Ford" };

속성 이름을 전달할 수있는 메서드를 작성하고 속성 값을 반환합니다. 즉 :

public string GetPropertyValue(string propertyName)
{
   return the value of the property;
}

답변:


310
return car.GetType().GetProperty(propertyName).GetValue(car, null);

17
이것이 반사를 사용하기 때문에 훨씬 느리다는 것을 명심하십시오. 아마 문제는 아니지만 알고 있어야합니다.
Matt Greer

"문자열에서 BindingFlags로 변환 할 수 없음"
Christine

5
@MattGreer "빠른"방법이 있습니까?
FizxMike

44

리플렉션을 사용해야합니다

public object GetPropertyValue(object car, string propertyName)
{
   return car.GetType().GetProperties()
      .Single(pi => pi.Name == propertyName)
      .GetValue(car, null);
}

정말 화려하고 싶다면 확장 방법으로 만들 수 있습니다.

public static object GetPropertyValue(this object car, string propertyName)
{
   return car.GetType().GetProperties()
      .Single(pi => pi.Name == propertyName)
      .GetValue(car, null);
}

그리고:

string makeValue = (string)car.GetPropertyValue("Make");

SetValue 대신 GetValue를 원합니다.
Matt Greer

SetValue에 대해서도이 작업을 수행 할 수 있습니까? 어떻게?
Piero Alberto

1
사소한 것-확장 방법은 아마도 이름이 붙은 변수를 가질 필요가 없습니다car
KyleMit

propertyName 문자열을 기반으로 속성 값을 설정하는 방법을 보려면 여기에 대한 답변을 참조하십시오. 리플렉션을 통해 속성 값 설정
nwsmith

35

당신은 반사를 원한다

Type t = typeof(Car);
PropertyInfo prop = t.GetProperty("Make");
if(null != prop)
return prop.GetValue(this, null);

7
+1 이것은 모든 중간 물체를 보여줄 때 가장 좋은 대답입니다
Matt Greer

1
속성 값을 전달하는 대신 인덱스를 전달하고 속성 이름과 값을 얻을 수 있습니까 (따라서 모든 속성을 반복 할 수 있습니까)?
singhswat

@singhswat 당신은 그것을 새로운 질문으로해야합니다.
척 새비지

7

간단한 샘플 (클라이언트에서 쓰기 리플렉션 하드 코드없이)

class Customer
{
    public string CustomerName { get; set; }
    public string Address { get; set; }
    // approach here
    public string GetPropertyValue(string propertyName)
    {
        try
        {
            return this.GetType().GetProperty(propertyName).GetValue(this, null) as string;
        }
        catch { return null; }
    }
}
//use sample
static void Main(string[] args)
    {
        var customer = new Customer { CustomerName = "Harvey Triana", Address = "Something..." };
        Console.WriteLine(customer.GetPropertyValue("CustomerName"));
    }

7

또한 다른 사람들 은 다음과 같은 확장 방법을 사용 하여 모든 객체 의 속성 값을 쉽게 얻을 수 있다고 대답 합니다 .

public static class Helper
    {
        public static object GetPropertyValue(this object T, string PropName)
        {
            return T.GetType().GetProperty(PropName) == null ? null : T.GetType().GetProperty(PropName).GetValue(T, null);
        }

    }

사용법은 :

Car foo = new Car();
var balbal = foo.GetPropertyValue("Make");

7

Adam Rackis의 답변을 확장하면 다음과 같이 확장 방법을 일반적으로 만들 수 있습니다.

public static TResult GetPropertyValue<TResult>(this object t, string propertyName)
{
    object val = t.GetType().GetProperties().Single(pi => pi.Name == propertyName).GetValue(t, null);
    return (TResult)val;
}

원하는 경우 오류 처리를 던질 수도 있습니다.


1

반영을 피하기 위해 요청한 특성에서 해당 값을 리턴하는 사전 값 파트에서 고유 이름을 키 및 함수로 사전을 설정할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.