2014-10-05 1 views
2

현재 Java에서 C#으로 프레임 워크의 일부를 이식 중입니다.Java에서 C#으로 변환 리플렉션을 사용하여 서브 클래스의 공개 필드 찾기

필자는 Java에서 다음 행을 사용하여 추상 클래스의 서브 클래스 선언 순서로 선언 된 필드를 가져 왔습니다. 그런 다음이 필드 목록을 사용하여 리플렉션을 통해 값을 설정합니다.

Field[] fields = this.getClass().asSubclass(this.getClass()).getDeclaredFields(); 

나는 다음과 같은 방법으로 C#에서 동일한 결과를 얻으려고 시도했다. 그러나 이것은 슈퍼 클래스의 모든 공개 필드를 반환 할 것입니다.

IEnumerable<FieldInfo> fields = this.GetType().GetFields().OrderBy(field => field.MetadataToken); 

Java 메소드와 동일한 결과를 얻을 수있는 방법이 있습니까?

자신을 반복하려면 현재 클래스의 하위 클래스 중 선언 된 필드 만 필요합니다.

+0

어쩌면 내가 없었 한만큼 커피를 , "this.getClass(). asSubclass (this.getClass())"가 "this.getClass()"와 다른 점은 무엇입니까? –

+0

하하, 아마도 그렇지 않습니다. 그것은 얼마 전에 나는 그것을 썼다. 아마도 그것이 하위 클래스 일 뿐이라는 것을 확인하려고했습니다. –

답변

6

패스 :

회원 만이 고려되어야한다 제공된 유형의 계층 구조의 수준에서 선언을 지정합니다. 상속 된 멤버는 고려되지 않습니다. 당신을 가정 예를 들어

는뿐만 아니라 민간 분야를 원하고, 인스턴스와 정적 필드 모두 - 플래그를 제거 당신이하지이 원하는 할 : 아직

var fields = GetType().GetFields(BindingFlags.DeclaredOnly | 
           BindingFlags.Public | 
           BindingFlags.NonPublic | 
           BindingFlags.Static | 
           BindingFlags.Instance) 
         .OrderBy(...); 
1

당신은 단지 BindingFlags.DeclaredOnly를 사용할 필요가 BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly

+0

하위 클래스의 필드 만 가져올 수 있습니까? –

+0

@LexWebb : 슈퍼 클래스에서 선언 한 필드를 반환하지 않습니다. – SLaks

관련 문제