2010-11-24 4 views
1

모노에서 Mono.Cecil 형식으로 파싱하는 중입니다. 유형 구문 분석이 getter에 액세스하는지 어떻게 확인할 수 있습니까? 다른 클래스의 메소드? 필드에 액세스하기위한CIL 지침 : getter 메서드가 호출되는지 확인하십시오.

직접 나는 해결책 발견 :

foreach (MethodDefinition method in type.Methods) 
      { 
       foreach (Instruction instruction in method.Body.Instructions) 
       { 

        if (instruction.OpCode == OpCodes.Ldfld) 
        { 
         FieldReference field = instruction.Operand as FieldReference; 



         if (fields.Contains(field.ToString()) && !accesses.Contains(field.ToString())) 
         { 
          accesses.Add(field.ToString()); 
          Console.WriteLine("Class " + type.Name + " accesses field " + field.Name + " of a foreign class."); 
         } 

        } 
       } 
      } 

을하지만 다른 클래스의 필드가 getter 메소드에 액세스하면 나는 문제를 해결할 수있는 방법?

질문을 단순화하려면 : 방법이 CIL 명령을 사용하는 getter 메서드인지 어떻게 확인할 수 있습니까? 어떻게 어떤 필드가 반환되는지 감지 할 수 있습니까?

+0

getter가 반드시 필드를 반환 할 필요는 없습니다. 상수 값을 반환 할 수 있습니다. 필드를 결합하는 일부 수학을 수행 할 수 있습니다. 난수를 반환 할 수 있습니다. 꽤 많이. – Donnie

+0

네, 알고 있습니다. 그래서 그걸 확인하고 싶습니다. –

답변

3

Donnie가 의견에서 제안한 것처럼 게터와 설정자는 다른 방법과 같습니다. 그들은 그들이 원하는 것만 큼 많이 돌려 줄 수 있습니다. 원하는만큼 복잡 할 수 있습니다. 그래서 무엇을 하든지 최선을 다해 교육받은 것입니다.

먼저, MethodDefinition의 의미 론적 속성을 살펴볼 수 있습니다. 메서드가 getter 또는 setter라고 말하면 적어도 속성에 연결된 지 알 수 있습니다.

이제 블로그 게시물 에서처럼 retrieving the backing field of a property과 같은 특정 패턴을 찾으려고 IL을 분석 할 수도 있습니다. Mono 대신에 Mono.Cecil을 사용하도록 코드를 조정해야합니다. Reflection,하지만 큰 문제는 아닙니다.

+0

힌트를 보내 주셔서 감사합니다. 그러나 방금 MethodDefinition # isSetter 및 MethodDefinition # isGetter 메서드를 찾았습니다. 그들이 뭐하고 있니? – RoflcoptrException

+0

정확하게 내 답변에서 말하는 것은 메서드가 getter 또는 속성에 getter로 첨부되어 있는지 여부를 알려줍니다. 그러나 다시 메서드가 단순 필드를 반환하는«단순»getter인지 여부는 알려주지 않습니다. –

+0

아 감사합니다. 내 솔루션으로는 충분하다. – RoflcoptrException