2010-11-24 18 views
1

Im Parsing durch einen Typ mit Mono.Cecil. Wie kann ich prüfen, ob der Typ im Parsing auf Getter-Methoden anderer Klassen zugreift?CIL Anweisungen: Überprüfen Sie, ob eine Getter-Methode aufgerufen wird?

Für die Felder direkt Zugriff Ich habe eine Lösung gefunden:

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."); 
         } 

        } 
       } 
      } 

Aber wie kann ich das Problem lösen, wenn das Feld einer anderen Klasse durch eine Getter-Methode zugegriffen wird?

Oder um die Frage zu vereinfachen: Wie kann ich feststellen, ob eine Methode eine Getter-Methode mit CIL-Anweisungen ist? und wie kann ich erkennen, welches Feld zurückgegeben wird?

+0

Ein Getter muss nicht immer ein Feld zurückgeben. Es kann einen konstanten Wert zurückgeben, es kann einige Berechnungen durchführen, um Felder zu kombinieren. Es kann eine Zufallszahl zurückgeben. So ziemlich alles. – Donnie

+0

Ja, ich bin mir dessen bewusst. Deshalb möchte ich es überprüfen. –

Antwort

3

Wie Donnie in den Kommentaren vorschlägt, sind Getter und Setter genau wie alle anderen Methoden. Sie können so ziemlich alles zurückgeben, was sie wollen, so komplex sein, wie sie wollen, usw. Also, was immer Sie tun werden, ist bestenfalls eine fundierte Vermutung.

Zunächst können Sie sich die semantischen Attribute der MethodDefinition ansehen. Wenn es besagt, dass die Methode ein Getter oder ein Setter ist, wissen Sie zumindest, ob es an eine Eigenschaft angehängt ist.

Jetzt können Sie auch die IL analysieren, um ein bestimmtes Muster zu finden, wie ich es in meinem Blogpost über retrieving the backing field of a property getan habe. Sie müssten den Code anpassen, um Mono.Cecil anstelle von Mono.Reflection zu verwenden, aber das sollte keine große Sache sein.

+0

Danke für Ihren Hinweis. Allerdings habe ich gerade die Methoden MethodDefinition # isSetter und MethodDefinition # isGetter gefunden. Was machen sie? – RoflcoptrException

+0

Genau das, was ich in meiner Antwort sage, sagt Ihnen, ob die Methode als Getter oder als Getter an eine Eigenschaft angehängt ist. Aber es sagt dir auch nicht, ob die Methode ein «einfacher» Getter ist, der ein einfaches Feld zurückgibt. –

+0

Ah ok danke. Das ist genug für meine Lösung. – RoflcoptrException

Verwandte Themen