2014-01-16 3 views
0

내 개체를 분석하고 속성을 목록에 표시해야합니다. 내 개체에 기본 클래스 "ObjectBaseClass"에서 가져온 일부 속성이 있습니다. 이러한 속성은 내 목록에 표시하면 안됩니다.C#의 속성 소유자 클래스를 얻는 방법

내가 알 수있는 것은 속성이 기본 클래스에서 왔는지 아닌지입니다.

즉 IDisposableExtended 인터페이스가 있고,이 인터페이스는 내 객체 클래스에서 구현됩니다. 그러나 내 목록에서 나는이 두 속성을 "일회용"및 "처분"으로 표시하고 싶지 않습니다. 어떻게 필터링 할 수 있습니까?

public interface IDisposableExtended : IDisposable 
{ 
    bool Disposable { get; } 
    bool Disposed { get; } 
} 

감사합니다.

p.s 속성은 기본 클래스 (수준 1)에서 올 수 있으며 기본 클래스 (수준 1)는 자신의 기본 클래스 (수준 2)에서 일부 속성을 가질 수도 있습니다. BindingFlags.DeclaredOnly가 포함 된 GetProperties (플래그)를 사용할 때 모든 속성이 기본 클래스 (레벨 1 및 레벨 2)에서 필터링됩니다. 기본 클래스 수준 1 또는 2 만 필터링 할 수 있습니까? 즉, 먼저 모든 속성을 가져 와서 기본 클래스에 따라 수동으로 필터링하려고합니다. 그런 다음 필요한 모든 속성을 보여줄 수있는 모든 권한을 갖습니다.

답변

0

Type.GetProperty(String, BindingFlags) 메서드 오버로드를 사용하고 BindingFlags.DeclaredOnly을 포함 시켜서 상속되지 않은 멤버로 검색을 제한해야합니다.

더 여기 읽기 : http://msdn.microsoft.com/en-us/library/kz0a8sxy(v=vs.110).aspx

주석 (내가 제대로 이해하고 있는지 확실하지 않습니다 비록)에 대응. 다음은 유형 계층 구조를 탐색하고 각 레벨에서 상속 된 것을 제외하고 유형 자체에 선언 된 특성을 표시하는 빠른 프로그램입니다.

namespace ConsoleApplication1 
{ 
    class ClassA 
    { 
     public string ClassAProp { get; set; } 
    } 

    class ClassB : ClassA 
    { 
     public string ClassBProp { get; set; } 
    } 

    class ClassC : ClassB 
    { 
     public string ClassCProp { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var c = new ClassC(); 
      var t = c.GetType(); 
      while (t.BaseType != null) 
      { 
       var cProps = t.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public); 
       foreach (var p in cProps) 
       { 
        Console.WriteLine("{0} defines {1}", t.Name, p.Name); 
       } 
       t = t.BaseType; 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

그래서 'BindingFlags.DeclaredOnly'는 클래스에 선언 된 속성 만 반환합니다. 희망이 당신이 찾고있는 것을 달성하는 데 도움이됩니다.

참고 : object 유형의 경우Type.BaseType은 루트 유형이므로 null이됩니다. 루프를 다른 유형으로 멈추게하려면 while (t != TypeYouWantToStopAt.GetType())

+0

속성은 기본 클래스 (수준 1)에서 올 수 있으며 기본 클래스 (수준 1)는 자신의 기본 클래스 (수준 2)에서 일부 속성을 가질 수도 있습니다. BindingFlags.DeclaredOnly가 포함 된 GetProperties (플래그)를 사용할 때 모든 속성이 기본 클래스 (레벨 1 및 레벨 2)에서 필터링됩니다. 가능합니까, 기본 클래스 수준 1 또는 2 만 필터링합니까? 즉, 모든 속성을 먼저 가져 와서 기본 클래스에 따라 수동으로 필터링하려고합니다. 그런 다음 필요한 모든 속성을 보여줄 수있는 모든 권한을 갖습니다. – Ivan

1

우선, 이러한 속성의 "소유자"는 실제로 인터페이스가 아닌 클래스입니다. 인터페이스는 해당 속성에 액세스를 제공하지만 이러한 속성 중을 선언하는 유형은 여전히 ​​클래스입니다.

그러나 리플렉션을 통해 속성을 발견하면 상속하는 속성의 유형이이 달라집니다. Derived의 속성을 덤프 때 해당 유형 선언 이후

void Main() 
{ 
    var derivedType = typeof(Derived); 
    derivedType.GetProperties().Dump("All"); 
    derivedType.GetProperties(BindingFlags.DeclaredOnly 
     | BindingFlags.Public | BindingFlags.Instance).Dump("Declared only"); 
} 

public class Base 
{ 
    public string BaseProperty { get; set; } 
} 

public class Derived : Base 
{ 
    public string DerivedProperty { get; set; } 
} 

참고도 Derived에 인터페이스를 구현하는 경우 있는지, 그 방법은/속성도 표시됩니다 : 여기에 보여주는 LINQPad 프로그램입니다. 예, 인터페이스를 구현하는 데 사용되지만 형식에 따라 선언 (소유)됩니다.

+0

속성은 기본 클래스 (수준 1)에서 올 수 있으며 기본 클래스 (수준 1)는 자신의 기본 클래스 (수준 2)에서 일부 속성을 가질 수도 있습니다. BindingFlags.DeclaredOnly가 포함 된 GetProperties (플래그)를 사용할 때 모든 속성이 기본 클래스 (레벨 1 및 레벨 2)에서 필터링됩니다. 가능합니까, 기본 클래스 수준 1 또는 2 만 필터링합니까? 즉, 모든 속성을 먼저 가져 와서 기본 클래스에 따라 수동으로 필터링하려고합니다. 그런 다음 필요한 모든 속성을 보여줄 수있는 모든 권한을 갖습니다. – Ivan

0

이것은 약간의 문제는 아니지만 설명하는 문제에 대한 다른 접근 방법에 대한 아이디어를 줄 수 있습니다.

목록에 표시하지 않을 속성 (또는 실제 구성원)을 표시하는 데 사용하는 사용자 지정 특성을 선언 할 수 있습니다. 개체의 속성을 열거하면 속성을 검사하고 표시 한 항목을 건너 뛸 수 있습니다. 이는 .NET 속성 편집기 컨트롤이 작동하는 방식과 유사합니다.

+0

답변 해 주셔서 감사합니다. 나는 그것에 대해서도 생각해 보았다. 그러나 그렇게하기에는 너무 비싸다 ;-) – Ivan