Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Execution Context, контекст исполнения метода 
:(
    Опции темы
SpaceSpace
Дата 21.10.2008, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 10.4.2007
Где: Самара

Репутация: 2
Всего: 10



Всем доброго вечера.

Объясните плз глупому программеру.

Есть метод А(),
к методу применены атрибуты [1][2]
В методе А() что то делается с классом С,

Возможно ли в принципе навесить атрибуты вызывающего метода
на используемые внутри него объекты????

подозреваю что нет,
подскажите плз workaround для передачи метаинформации вниз по стеку вызова.

Спасибо.


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
jonie
Дата 21.10.2008, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



думаю это будет непросто.
могу подсказать куда примерно копать.. думаю "вам туда".
есть такая штука - .NET Remoting и его инфраструктура, которая напрочь помечана как "не для вас, простых смерных".

Например на его основе можно реализовать динамизм... 
вспомню только на логирование методов (вызовы)

1. Класс, подлежащий логированию наследутеся от ContextBoundObject
2. Создается класс атрибута class AttributeSpy : ContextAttribute
делается override двух методов GetPropertiesForNewContext(IConstructionCallMessage) и IsContextOK(Context, IConstructionCallMessage)
примерно по такой схеме:
Код

    [AttributeUsage(AttributeTargets.Class)]
    class AttributeSpy : ContextAttribute
    {
        private string _name = string.Empty;

        public AttributeSpy(string name)
            : base(name)
        {
            _name = name;
        }

        public override void GetPropertiesForNewContext(System.Runtime.Remoting.Activation.IConstructionCallMessage ctorMsg)
        {
            ctorMsg.ContextProperties.Add(new PropertySpy(_name));
        }

        public override bool IsContextOK(Context ctx, System.Runtime.Remoting.Activation.IConstructionCallMessage ctorMsg)
        {
            PropertySpy spy = ctx.GetProperty(_name) as PropertySpy;

            if (spy == null)
                return false;
            return true;
        }
    }

3. Делается класс PropertySpy. Примерно так:
Код

    class PropertySpy : IContextProperty, IContributeObjectSink
    {
        public PropertySpy(string name)
        {
            _name = name;
        }

        #region IContextProperty Members

        void IContextProperty.Freeze(Context newContext)
        {}

        bool IContextProperty.IsNewContextOK(Context newCtx)
        {
            PropertySpy spy = newCtx.GetProperty(_name) as PropertySpy;

            if( spy == null )
                return false;
            return true;
        }

        private string _name = string.Empty;
        string IContextProperty.Name
        {
            get
            {
                return _name;
            }
        }

        #endregion

        #region IContributeObjectSink Members

        public System.Runtime.Remoting.Messaging.IMessageSink GetObjectSink(MarshalByRefObject obj, System.Runtime.Remoting.Messaging.IMessageSink nextSink)
        {
            return new MessageSinkSpy(nextSink);
        }

        #endregion
    }

4. Делается класс MessageSinkSpy
Код

    class MessageSinkSpy : IMessageSink
    {
        private IMessageSink _nextSync;
        public MessageSinkSpy(IMessageSink nextSync)
        {
            _nextSync = nextSync;
        }

        #region IMessageSink Members

        IMessageCtrl IMessageSink.AsyncProcessMessage(IMessage msg, IMessageSink replySink)
        {
            if (msg is IMethodCallMessage)
            {
                IMethodCallMessage callingMessage = msg as IMethodCallMessage;
                LogHelper.LogMethodCall(callingMessage);

            }

            return _nextSync.AsyncProcessMessage(msg, replySink);
        }

        IMessageSink IMessageSink.NextSink
        {
            get
            {
                return _nextSync;
            }
        }

        IMessage IMessageSink.SyncProcessMessage(IMessage msg)
        {
            IMethodCallMessage callingMessage = msg as IMethodCallMessage;
            //тут логируем входящие параметры функции и т.п.

            IMethodReturnMessage returnMessage = _nextSync.SyncProcessMessage(msg) as IMethodReturnMessage;
            //а тут логируем выходные параметры

            return returnMessage;
        }

        #endregion
    }


5. К классу из п1 применяется атрибут AttributeSpy

подробности об этом можно прочитать в книге про .NET Remoting в главе про создание прокси-классов....



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0445 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.