С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
NEvOl
19 / 18 / 1
Регистрация: 13.08.2012
Сообщений: 734
1

Отслеживание вызовов методов

19.07.2015, 08:30. Просмотров 1099. Ответов 17
Метки нет (Все метки)

Здравствуйте, имеется класс с методами:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public class ClassA
    {
        public ClassA()
        {
        }
 
        public void Method1()
        {
            //какие-то действия
        }
 
        public void Method2()
        {
            //какие-то действия
        }
    }
можно ли как-нибудь в C# отслеживать вызовы методов данного класса без использования событий ?
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.07.2015, 08:30
Ответы с готовыми решениями:

Чем событие отличается от вызовов методов
Объясните, чем отличается событие от простого вызова методов? Насколько я...

Реализовать ввод исходных данных, расчет и вывод данных в виде методов класса. В Main только создание объектов и вызов методов
Всем привет) помогите пожалуйста с заданием "Реализовать ввод исходных данных,...

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

Переполнение стека вызовов
using System; using System.Collections.Generic; namespace Lists { ///...

Функция подсцета рекурсивных вызовов
Есть ли функция возвращающее число которое показывает который раз вызвана...

17
VoltDeMar
16 / 16 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
19.07.2015, 08:57 2
Цитата Сообщение от NEvOl Посмотреть сообщение
можно ли как-нибудь в C# отслеживать вызовы методов данного класса без использования событий ?
Отслеживать из текущего кода или из вне приложения? Если из текущего кода, то на ум приходит использовать флаги + потоки. А какая конкретная задача?
1
NEvOl
19 / 18 / 1
Регистрация: 13.08.2012
Сообщений: 734
19.07.2015, 09:04  [ТС] 3
VoltDeMar, отслеживать нужно из текущего кода. Задача такая:
Имеется некоторый класс (например ClassA), у него может быть множество методов (5-10), нужно создать механизм что бы после вызова любого метода из класса ClassA, оповещался некоторый класс ClassB, если использовать какие-то события то придется в каждом методе класса ClassA вызывать соответствующее событие и привязывать это событие к методам класса ClassB (а если в классе ClassA будут добавляться еще методы то придется каждый раз прописывать вызов событие), хотелось бы что-нибудь более гибкое, но при этом это не должно влиять на производительность.
1
VoltDeMar
16 / 16 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
19.07.2015, 09:24 4
Цитата Сообщение от NEvOl Посмотреть сообщение
VoltDeMar, отслеживать нужно из текущего кода. Задача такая:
Имеется некоторый класс (например ClassA), у него может быть множество методов (5-10), нужно создать механизм что бы после вызова любого метода из класса ClassA, оповещался некоторый класс ClassB, если использовать какие-то события то придется в каждом методе класса ClassA вызывать соответствующее событие и привязывать это событие к методам класса ClassB (а если в классе ClassA будут добавляться еще методы то придется каждый раз прописывать вызов событие), хотелось бы что-нибудь более гибкое, но при этом это не должно влиять на производительность.
Можно создать флаг с именем метода, и вызывать методы этого класса в отдельном потоке, в таком порядке, чтобы сразу после обращения к экземпляру класса основной поток проверял флаг на наличие/отсутствие вызванного метода и предпринимал нужные действия. Если приложение не подразумевает параллельности выполнения действия методов класса ClassA и реагирующих на них действий, то вообще можно обойтись одним флагом.

Однако, подозреваю что существует возможность создать паттерн события, который можно будет унаследовать каждым методом, точную реализацию такого подсказать не смогу.
1
NEvOl
19 / 18 / 1
Регистрация: 13.08.2012
Сообщений: 734
19.07.2015, 09:29  [ТС] 5
VoltDeMar, что за флаги о которых вы говорите ?
1
VoltDeMar
16 / 16 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
19.07.2015, 09:32 6
Какие приоритеты (производительность, память, быстрота написания, удобство кода)?

Добавлено через 2 минуты
Цитата Сообщение от NEvOl Посмотреть сообщение
VoltDeMar, что за флаги о которых вы говорите ?
Переменная в глобальном пространстве имен, доступная методам. Метод при вызове записывает в неё код, который Вы проверяете из того места программы где это актуально и выполняете сопутствующие действия, затем переменную обнулив либо установив другое значение.
1
XRoy
862 / 712 / 305
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
19.07.2015, 09:43 7
NEvOl,
Смотрите в сторону аспектно-ориентированого программирования, есть фреймфорк PostSharp

В результате можно будет писать нечто такое
C#
1
2
3
4
5
 [LogMethod(Loged = true)]
        public static void Foo()
        {
            Console.WriteLine("Foo()");
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        [Serializable]
        public class LogMethodAttribute : PostSharp.Aspects.MethodInterceptionAspect
        {
            public bool Loged { get; set; }
 
            public override void OnInvoke(PostSharp.Aspects.MethodInterceptionArgs args)
            {
                if (Loged)
                {
                    // log our call
                }
 
                base.OnInvoke(args);
            }
        }
    }
1
NEvOl
19 / 18 / 1
Регистрация: 13.08.2012
Сообщений: 734
19.07.2015, 09:53  [ТС] 8
VoltDeMar, удобство кода в приоритете. Если использовать переменные то все равно придется в каждом новом методе писать новый код. И как узнать был ли вызов или нет, это придется переодически проверять значение переменной ?

Добавлено через 3 минуты
XRoy, использование сторонних фреймфорков нежелательно, а вот механизм похож на требуемый, интересно как реализован тут перехват вызова
0
VoltDeMar
16 / 16 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
19.07.2015, 10:05 9
Цитата Сообщение от NEvOl Посмотреть сообщение
Если использовать переменные то все равно придется в каждом новом методе писать новый код.
Использовать родительский класс который имеет метод записи. Я не знаком с ньюансами такого наследования которые позволили бы унаследовать одно действие для ряда методов, но не исключаю что они существуют.

Цитата Сообщение от NEvOl Посмотреть сообщение
И как узнать был ли вызов или нет, это придется переодически проверять значение переменной ?
Именно.
1
NEvOl
19 / 18 / 1
Регистрация: 13.08.2012
Сообщений: 734
19.07.2015, 10:15  [ТС] 10
VoltDeMar, тогда было бы удобно воспользоваться наследованием пор которое вы говорите совместно с событиями, это избавило бы от необходимости периодических проверок, и от дублировании кода вызова событий, только не понятно как можно отнасловаться так.
0
XRoy
862 / 712 / 305
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
19.07.2015, 10:31 11
Цитата Сообщение от NEvOl Посмотреть сообщение
интересно как реализован тут перехват вызова
На сколько я знаю PostSharp во время компиляции сканирует сборки и вносит изменения в MSIL код
1
VoltDeMar
16 / 16 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
19.07.2015, 10:31 12
Цитата Сообщение от NEvOl Посмотреть сообщение
VoltDeMar, тогда было бы удобно воспользоваться наследованием пор которое вы говорите совместно с событиями, это избавило бы от необходимости периодических проверок, и от дублировании кода вызова событий, только не понятно как можно отнасловаться так.
Благо, про наследование в C# много информации в интернете (покрайней мере так было когда я его юзал).

Вы используете потоки? Если используются потоки, то проверка может выполняться в цикле, с заданной паузой. Если не используются - то вы можете выполнять проверку переменной именно там где это необходимо. Я не понял Вашу мысль насчет одновременного использования. Какую задачу будет выполнять Ваша программа?
1
NEvOl
19 / 18 / 1
Регистрация: 13.08.2012
Сообщений: 734
19.07.2015, 10:46  [ТС] 13
XRoy, через рефлексию ?

Добавлено через 7 минут
VoltDeMar, есть некоторый класс методы которого отвечают за сохранение данных в БД, хочу что бы при вызове этих методов вызывались автоматически методы кеширования данных, но так как методов много и они еще будут пополняться придется в каждом методе вызывать соответствующий метод кеширования. Хочется как-то автоматизировать этот процесс, или хотя бы упростить (да бы не забыть вызвать соответствующий метод кешировани в новом методе записи данных в БД).
Многопоточность я не использую.
По поводу скрещивания, если удалось бы наследовать одно поведение базового класса для всех методов наследуемого клааса, от в базовом классе можно было бы просто Инвокать событие к которому цеплялся обработчик из класса кеширования. Как то так.
0
XRoy
862 / 712 / 305
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
19.07.2015, 10:48 14
NEvOl,
Нет, сторонней программой реализуется разбор и редактирование MSIL.
АОП сложен в реализации

Более простой вариант написать свой IoC контейнер и декорировать вызовы

Самый простой использовать события
1
NEvOl
19 / 18 / 1
Регистрация: 13.08.2012
Сообщений: 734
19.07.2015, 10:54  [ТС] 15
XRoy, IoCи юзаю, но как они работаю понятия не имею, попробую нагуглить что-нибудь спасибо
0
XRoy
862 / 712 / 305
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
19.07.2015, 10:54 16
Цитата Сообщение от NEvOl Посмотреть сообщение
что бы при вызове этих методов вызывались автоматически методы кеширования данных
Подход не правильный, все запросы должны проходить через кеш, а он уже сам будет решать откудого брать данне, обновлять из БД или доставать их где-то у себя.
1
NEvOl
19 / 18 / 1
Регистрация: 13.08.2012
Сообщений: 734
19.07.2015, 11:02  [ТС] 17
XRoy, спасибо, поправлю логику
0
diadiavova
3954 / 1384 / 428
Регистрация: 11.04.2015
Сообщений: 2,583
Записей в блоге: 35
19.07.2015, 11:17 18
Цитата Сообщение от NEvOl Посмотреть сообщение
XRoy, использование сторонних фреймфорков нежелательно, а вот механизм похож на требуемый
PostSharp - не единственный АОП-фреймворк. Когда я интересовался вопросом, мне попался, если сейчас не ошибаюсь вот этот фреймворк
AspectDNG.
Интересен он тем, что в программе можно вообще не оставлять следов использования стороннего фреймворка. Там используется следующий механизм: Создается специальный файл конфигурации, в котором описываются аспекты и к чему их надо "приклеить". Выбор сущностей кода, к которым применяется тот или иной аспект, осуществляется с использованием двух механизмов: регулярных выражений и XPath. Далее запускается утилитка, которой "скармливается" конфигурация и эта утилитка просто патчит сборку в соответствии с конфигурацией.
А так в принципе да, согласен с XRoy, это задача как раз для AOP.

Добавлено через 5 минут
Цитата Сообщение от NEvOl Посмотреть сообщение
интересно как реализован тут перехват вызова
В частности упомянутый проект использует Mono.Cecil, в принципе с ее помощью можно и самому вносить изменения в сборку.
1
19.07.2015, 11:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2015, 11:17

Создать функцию с подсчетом вызовов
В общем, примитивная задача, решил её таким образом: using System; ...

Порядок вызовов конструкторов в иерархии
Столкнулся с весьма интересной проблемой. У меня довольно обширная иерархия, но...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru