Development Tip

.NET 리플렉션에서 BindingFlags.DeclaredOnly와 함께 GetProperties () 사용

yourdevel 2020. 12. 14. 20:53
반응형

.NET 리플렉션에서 BindingFlags.DeclaredOnly와 함께 GetProperties () 사용


내가 사용한다면

sometype.GetProperties();

유형에서 모든 속성을 가져오고 부모입니다. 그러나 부모가 아닌이 유형에 명시 적으로 정의 된 속성 만 검색하고 싶습니다. 나는 그것이 BindingFlags.DeclaredOnly옵션 이라고 생각했습니다 .

그러나 이것을 시도하면 :

sometype.GetProperties(BindingFlags.DeclaredOnly);

0 개의 속성을 얻습니다.

아무도 내가 뭘 잘못하고 있는지 알아?


any를 지정하는 경우 BindingFlags가져 오려는 속성을 명시 적으로 지정해야합니다. 예를 들면 :

sometype.GetProperties (BindingFlags.DeclaredOnly | 
                        BindingFlags.Public | 
                        BindingFlags.Instance);

요약:

  1. GetProperties()(매개 변수없이) 오버로드 를 사용하면 모든 공용 속성 을 얻을 수 있습니다 .

  2. 반면에 GetProperties(BindingFlags)오버로드 ( BindingFlags매개 변수 를 허용하는 것 )를 사용하는 경우 다음 플래그의 각 그룹에서 적어도 하나의 비트 OR을 지정해야합니다.

    • BindingFlags.Instance/ BindingFlags.Static(인스턴스 대 정적 속성),
    • BindingFlags.Public/ BindingFlags.NonPublic(공용 및 비공개 속성).

예를 들어 공개 정적 속성 GetProperties(BindingFlags.Public | BindingFlags.Static)을 가져 오려면 결과를 얻기 위해 호출해야 합니다. 호출 만하 GetProperties(BindingFlags.Public)거나 GetProperties(BindingFlags.Static)결과를 반환하지 않습니다.

또한 지정 BindingFlags.Default하면 빈 배열 이 반환 됩니다 .

자세한 내용은 GetProperties (BindingFlags)에 대한 MSDN 설명서 에서 찾을 수 있습니다 .

다음 BindingFlags 필터 플래그를 사용하여 검색에 포함 할 중첩 유형을 정의 할 수 있습니다.

  • 반품을 받으려면 BindingFlags.Instance또는 중 하나를 지정해야합니다 BindingFlags.Static.
  • BindingFlags.Public검색에 공용 속성을 포함하도록 지정 합니다.
  • 검색에 BindingFlags.NonPublic비공개 방법 (즉, 개인, 내부 및 보호 방법)을 포함하도록 지정 합니다. 기본 클래스의 보호 및 내부 메서드 만 반환됩니다. 기본 클래스의 개인 메서드는 반환되지 않습니다.
  • BindingFlags.FlattenHierarchy계층 구조에 공용 및 보호 된 정적 멤버를 포함하도록 지정 하십시오. 상속 된 클래스의 개인 정적 멤버는 포함되지 않습니다.

다음 BindingFlags 수정 자 플래그를 사용하여 검색 작동 방식을 변경할 수 있습니다.

  • BindingFlags.DeclaredOnly 단순히 상속 된 속성이 아닌 Type에 선언 된 속성 만 검색합니다.

BindingsFlag를 약간 확장해야합니다. 의미있는 것을 되찾기 위해 최소한 어떤 접근성 수준과 인스턴스 대 정적을 포함해야합니다.

실제로 찾고있는 것은 다음과 같습니다.

var flags = BindingFlags.DeclaredOnly 
  | BindingFlags.Instance
  | BindingFlags.Public;
someType.GetProperties(flags);

보내는 사람 은 MSDN 사이트.

기본값 (멤버) 바인딩 플래그를 지정하지 않습니다.

Public 또는 NonPublic과 함께 Instance 또는 Static을 지정해야합니다. 그렇지 않으면 멤버가 반환되지 않습니다.

따라서 바인딩 플래그를 지정하지 않으면 아무것도 얻지 못합니다.


을 사용하는 데 문제가 있었는데 typeof(Thing)결국 이것은 나를 위해 일했습니다.

        var thisThing = (new Thing()).GetType();
        foreach (var property in thisThing.GetProperties())
        {
            // ...
        }

참고 URL : https://stackoverflow.com/questions/1544979/using-getproperties-with-bindingflags-declaredonly-in-net-reflection

반응형