2008-10-28 1 views
22

그래서 지금 내가 갖고있는 것은Reflection을 사용하여 클래스와 그 기본 클래스 (계층 구조)의 모든 속성을 어떻게 얻습니까? (기음#)

PropertyInfo[] info = obj.GetType().GetProperties(BindingFlags.Public); 

여기서 obj은 어떤 객체입니다.

문제는 내가 원하는 속성이 obj.GetType()에 없기 때문에 더 이상 기본 클래스에 속합니다. 디버거를 멈추고 obj를 보면 몇 가지 "기본"항목을 통해 파생시켜야하는 속성을 볼 수 있습니다. 그 바인딩을 반환 할 수있는 바인딩 플래그가 있습니까? 아니면 반복적으로 Type.BaseType 계층 구조를 파고 GetProperties 할 필요가 있습니까?

답변

21

사용이 :

PropertyInfo[] info = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); 

편집 : 정답은 Jay의입니다 물론. 매개 변수가없는 GetProperties()GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static)과 같습니다. 여기서 BindingFlags.FlattenHierarchy은 아무런 역할을하지 않습니다.

+0

Jay의 작품이 내가 원하는 것을 얻을 수 있기 때문에 나는 이것을 대답으로 표시하고 있는데, 이것이 왜 작동하는지 설명합니다. 나는 Instance와 Static이 둘 다 지정되지 않았다면 실제로 둘 다 반환하지 않았을 때 둘 다 기본값으로 설정한다고 가정했습니다. – Davy8

+0

내가보고있는 객체에는 최고 수준의 속성이 없었기 때문에 아무 것도 반환하지 않았을 때 최상위 수준의 속성을 검색하려고했을 뿐이므로 아무 것도 반환하지 않은 속성을 얻으려고했기 때문에 아무것도 반환하지 않았다고 가정했습니다. 정적 또는 인스턴스. – Davy8

4

Type.BaseType에 액세스하면 기본 유형을 얻을 수 있습니다. 각 기본 유형에 반복적으로 액세스 할 수 있으며 유형이 System.Object 일 때 하단에 도달했을 때를 알 수 있습니다.

Type type = obj.GetType(); 
PropertyInfo[] info = type.GetProperties(BindingFlags.Public); 
PropertyInfo[] baseProps = type.BaseType.GetProperties(BindingFlags.Public); 
+2

당신을 사랑해. 좋은거야. 사람들이 왜 이걸 뽑았는데? – argatxa

+0

쿨! 고마워. 기본 클래스에 정적 멤버가 저장되었습니다. – Justjyde

12

나는 그렇게 복잡하다고 생각하지 않습니다.

당신이 GetProperties를에 BindingFlags 매개 변수를 제거하면, 당신은 당신이 찾고있는 결과를 얻을 생각 :

TypeDescriptor.GetProperties(obj); 
2

사용하여 생산을 니콜라스와 동의하는 경향이있다. 리플렉션이 필요하지 않다면 ComponentModel은 실행 가능한 모델 (예 : DataView/DataRowView)에 대해서도 올바른 메타 데이터를 얻을 수 있다는 장점이 있습니다. 예를 들어

:

foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(obj)) 
    { 
     Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj)); 
    } 
여담으로

, 당신이 몇 가지 간단한 performance tricks을 수행 할 수 있습니다; 당신은 반사 및 Delegate.CreateDelegate와 동일한 작업을 수행 할 수 있지만 TypeDescriptorTypeDescriptionProvider과 달리 논리를 숨길 수있는 중앙 집중식 장소가 없습니다 (익숙하지 않더라도 걱정할 필요가 없으며 "있는 그대로"코드를 사용할 수 있습니다) .-p).

3

I :

class B 
    { 
     public int MyProperty { get; set; } 
    } 

    class C : B 
    { 
     public string MyProperty2 { get; set; } 
    } 

    static void Main(string[] args) 
    { 
     PropertyInfo[] info = new C().GetType().GetProperties(); 
     foreach (var pi in info) 
     { 
      Console.WriteLine(pi.Name); 
     } 
    } 

 
    MyProperty2 
    MyProperty 
관련 문제