Инструкции CIL: Проверьте, вызван ли метод получения? - PullRequest
1 голос
/ 25 ноября 2010

Я анализирую тип с помощью Mono.Cecil. Как я могу проверить, имеет ли тип, с которым я разбираюсь, доступ к методам получения других классов?

Для прямого доступа к полям я нашел решение:

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

                    }
                }
            }

Но как я могу решить проблему, если доступ к полю другого класса осуществляется с помощью метода получения?

Или, чтобы упростить вопрос: как я могу определить, является ли метод методом получения, используя инструкции CIL? и как я могу определить, какое поле возвращается?

1 Ответ

3 голосов
/ 25 ноября 2010

Как предполагает Донни в комментариях, методы получения и установки такие же, как и любые другие методы. Они могут вернуть почти все, что захотят, быть настолько сложными, насколько захотят и т. Д. Поэтому все, что вы будете делать, будет в лучшем случае обоснованным предположением.

Для начала вы можете взглянуть на семантические атрибуты MethodDefinition. Если в нем говорится, что метод является геттером или сеттером, по крайней мере, вы будете знать, привязан ли он к свойству.

Теперь вы также можете проанализировать IL, чтобы попытаться найти определенный шаблон, как я делал в своем блоге о восстановлении поля поддержки свойства . Вы должны настроить код так, чтобы он использовал Mono.Cecil вместо Mono.Reflection, но это не должно иметь большого значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...