2012-12-06 2 views
1

dll에 사용 된 모든 구조체 선언 된 변수를 필터링 할 수 있습니까?dll에 사용되는 구조체 가져 오기

foreach (FieldInfo targetfield in InputType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static)) 
{ 
} 

등 할 수있는 모든 가능한 방법이 있나요 :

정적 필드의 경우 다음 코드를 사용하고 있습니다?

답변

0

멤버 변수를 필드 또는 로컬 변수라고 일컫습니까? http://mono-project.com/Cecil

+0

여기서 중요한 것은 모든 유형의 모든 구성원과 구조체 인 함수의 모든 변수를 찾는 것입니다. 구조체에 선언 된 모든 형식이 아닙니다. –

+0

사실, 너무 빨리 읽었습니다. – Hylaean

3

당신은 아마 전용 유형 원하는 :

  • 값 유형 (모든 구조체는 값의 종류) : 후자의 경우에, 당신은 세실 같은 디 컴파일러의 출력을 ... 걸어해야 참조 IsValueType 속성
  • 열거 형이 아닌 (열거 형은 값 형식이지만 구조체로 생각하지 않으려는 경우가 많습니다.) IsEnum 속성을 참조하십시오.
  • 기본 유형이 아님 (예 : Int32, 값 유형이지만 다시 "구조체"라고 생각하는 것이 아닙니다) IsPrimitive 속성을 참조하십시오. 이 같은

뭔가 : 예기치 않은 수 있습니다

const BindingFlags bindingFlags = 
    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static; 
var structFields = from field in InputType.GetFields(bindingFlags) 
        let type = field.FieldType 
        where type.IsValueType 
         && !type.IsEnum 
         && !type.IsPrimitive 
        select field; 
foreach (var targetField in structFields) { ... } 

한 가지 :이 포함됩니다 내장-하지만, 비 - 원시 값 유형 DateTimeTimeSpan처럼 ... 그들이 이기 때문에 구조체. 당신이하려는 일에 따라 그것이 괜찮은지 아닌지를 결정해야합니다. (내 경우, 나는 그들을 싶지 않았다.) 당신이 당신의 결과에 이들은, 가능성의 몇 수 있습니다 원하지 않는 결정하는 경우 :

  • 명시 적으로 (type != typeof(DateTime)을)를 필터링합니다.
  • mscorlib 어셈블리 (type.Assembly != typeof(object).Assembly)에서 모든 것을 필터링합니다.
관련 문제